欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

五個(gè)經(jīng)典鏈表OJ題帶你進(jìn)階C++鏈表篇

 更新時(shí)間:2022年03月24日 09:59:19   作者:程序猿教你打籃球  
做題之前呢,小編想提醒下大家,要三思而后行,不要一上來(lái)就嘎嘎敲代碼,要先學(xué)會(huì)自己畫(huà)圖分析,把自己的思路捋清楚,不要到時(shí)候?qū)懘a五分鐘,調(diào)試兩小時(shí),記住,編程思路很重要

反轉(zhuǎn)單鏈表

題目1:給你單鏈表的頭節(jié)點(diǎn) head ,請(qǐng)你反轉(zhuǎn)鏈表,并返回反轉(zhuǎn)后的鏈表。

示例 1:

輸入:head = [1,2,3,4,5]

輸出:[5,4,3,2,1]

題目來(lái)源:力扣

思路一: 翻轉(zhuǎn)指針?lè)较颍紫任覀円腥齻€(gè)指針,這個(gè)就不展示代碼了,邏輯過(guò)程如下:

 思路二:頭插方法,我們把每個(gè)節(jié)點(diǎn)拿下來(lái)進(jìn)行頭插實(shí)現(xiàn)!代碼實(shí)現(xiàn)如下:

struct ListNode* reverseList(struct ListNode* head)
{
	struct ListNode* cur = head;
	struct ListNode* newHead = NULL;
	while (cur)
	{
		struct ListNode* next = cur->next;
		
		//頭插
		cur->next = newHead;
		newHead = cur;
		cur = next;
	}
	return newHead;
}

返回鏈表中間節(jié)點(diǎn)的位置

題目2:給定一個(gè)頭結(jié)點(diǎn)為 head 的非空單鏈表,返回鏈表的中間結(jié)點(diǎn)。

如果有兩個(gè)中間結(jié)點(diǎn),則返回第二個(gè)中間結(jié)點(diǎn)。

示例 1:

輸入:[1,2,3,4,5,6]

輸出:此列表中的結(jié)點(diǎn) 4 (序列化形式:[4,5,6])

由于該列表有兩個(gè)中間結(jié)點(diǎn),值分別為 3 和 4,我們返回第二個(gè)結(jié)點(diǎn)

題目來(lái)源:力扣

思路: 我們使用快慢指針的辦法,快指針fast走兩步,慢指針slow走一步,這樣當(dāng)fast走完了,slow指針就走到了中間的位置,但是我們要注意,如果鏈表節(jié)點(diǎn)為奇數(shù)個(gè)則當(dāng)fast為NULL就應(yīng)該結(jié)束循環(huán),如果鏈表節(jié)點(diǎn)為偶數(shù)個(gè)則當(dāng)fast->next為NULL則結(jié)束循環(huán)!思路解析,代碼實(shí)現(xiàn)如下:

struct ListNode* middleNode(struct ListNode* head)
{
	struct ListNode* slow = head, * fast = head;
	while (fast && fast->next)
	{
		slow = slow->next;
		fast = fast->next->next;
	}
	return slow;
}

合并兩個(gè)有序鏈表

題目3:將兩個(gè)升序鏈表合并為一個(gè)新的 升序 鏈表并返回。新鏈表是通過(guò)拼接給定的兩個(gè)鏈表的所有節(jié)點(diǎn)組成的。 

示例 1:

輸入:l1 = [1,2,4], l2 = [1,3,4]

題目來(lái)源:力扣

思路:首先我們要判斷兩個(gè)鏈表是否為空,如果為空則返回另一個(gè)鏈表!接著我們需要定義兩個(gè)指針頭指針head和一個(gè)尾指針tail,接著我們比較list1->val是否大于list2->val然后進(jìn)行鏈接鏈表的操作,并且當(dāng)其中一個(gè)鏈表為空則跳出循環(huán),我們則需要在循環(huán)外再次判斷是哪個(gè)鏈表為空導(dǎo)致跳出的循環(huán),并且最后把不為空的鏈表鏈接在后面!最后返回頭指針head!

建議小伙伴們看著這個(gè)思路嘗試著自己寫(xiě)一下,可以參考如下代碼:

struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2)
{
	if (list1 == NULL)
		return list2;
	if (list2 == NULL)
		return list1;
	struct ListNode* head = NULL, * tail = NULL;
	if (list1->val < list2->val)
	{
		head = tail = list1;
		list1 = list1->next;
	}
	else
	{
		head = tail = list2;
		list2 = list2->next;
	}
 
	while (list1 != NULL && list2 != NULL)
	{
		if (list1->val < list2->val)
		{
			//尾插
			tail->next = list1;
			list1 = list1->next;
		}
		else
		{
			tail->next = list2;
			list2 = list2->next;
		}
		tail = tail->next;
 
	}
	if (list1)
		tail->next = list1;
	if (list2)
		tail->next = list2;
 
	return head;
}

判斷鏈表中是否有環(huán)

 給你一個(gè)鏈表的頭節(jié)點(diǎn) head ,判斷鏈表中是否有環(huán)。

如果鏈表中存在環(huán) ,則返回 true 。 否則,返回 false 。

示例 1:

輸入:head = [3,2,0,-4], pos = 1

輸出:true

解釋?zhuān)烘湵碇杏幸粋€(gè)環(huán),其尾部連接到第二個(gè)節(jié)點(diǎn)。

題目來(lái)源:力扣

思路: 我們使用快慢指針的方法,讓fast指針一次走兩步,slow指針一次走一步,當(dāng)鏈表有環(huán)的時(shí)候,當(dāng)slow進(jìn)入環(huán)了,fast就開(kāi)始追slow,假設(shè)fast跟slow的距離為N,每走一次fast跟slow的距離就會(huì)縮小一步,也就是N-1,N-2,N-3,N-4,直到N為0 fast就追上slow了!代碼實(shí)現(xiàn)如下:

bool hasCycle(struct ListNode *head) 
{
    struct ListNode* fast = head;
    struct ListNode* slow = head;
    while(fast && fast->next)
    {
        slow = slow->next;
        fast = fast->next->next;
        if(slow == fast)
            return true;
    }
    return false;
}

判斷環(huán)形鏈表進(jìn)入的節(jié)點(diǎn)

給定一個(gè)鏈表的頭節(jié)點(diǎn)  head ,返回鏈表開(kāi)始入環(huán)的第一個(gè)節(jié)點(diǎn)。 如果鏈表無(wú)環(huán),則返回 null。

不允許修改 鏈表。

示例 1:

輸入:head = [3,2,0,-4], pos = 1

輸出:返回索引為 1 的鏈表節(jié)點(diǎn)

解釋?zhuān)烘湵碇杏幸粋€(gè)環(huán),其尾部連接到第二個(gè)節(jié)點(diǎn)。

題目來(lái)源:力扣

 思路:我們還是用跟上面一樣的快慢指針的方法,但是在后面,一個(gè)指針從相遇點(diǎn)meet開(kāi)始走,一個(gè)指針從鏈表頭head開(kāi)始走,他們會(huì)在入口點(diǎn)相遇!圖解,代碼參考見(jiàn)下:

bool hasCycle(struct ListNode *head) 
{
    struct ListNode* fast = head;
    struct ListNode* slow = head;
    while(fast && fast->next)
    {
        slow = slow->next;
        fast = fast->next->next;
        if(slow == fast)
            return true;
    }
    return false;
}

??我們一起快樂(lè)編程不頭禿!

gitee(碼云):Mercury. (zzwlwp) - Gitee.com       

到此這篇關(guān)于五個(gè)經(jīng)典鏈表OJ題帶你進(jìn)階C++鏈表篇的文章就介紹到這了,更多相關(guān)C++ 鏈表內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論