国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【數(shù)據(jù)結(jié)構(gòu)】單鏈表經(jīng)典算法題的巧妙解題思路

這篇具有很好參考價值的文章主要介紹了【數(shù)據(jù)結(jié)構(gòu)】單鏈表經(jīng)典算法題的巧妙解題思路。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

題目

1.移除鏈表元素

2.反轉(zhuǎn)鏈表

3.鏈表的中間節(jié)點

4.合并兩個有序鏈表

5.環(huán)形鏈表的約瑟夫問題

解析

題目1:創(chuàng)建新鏈表

題目2:巧用三個指針

題目3:快慢指針

題目4:哨兵位節(jié)點

題目5:環(huán)形鏈表


?文章來源地址http://www.zghlxwxcb.cn/news/detail-860739.html

【數(shù)據(jù)結(jié)構(gòu)】單鏈表經(jīng)典算法題的巧妙解題思路,數(shù)據(jù)結(jié)構(gòu)

介紹完了單鏈表,我們這次來說幾個經(jīng)典的題目,本篇的題目銜接下一章雙向鏈表哦~?

題目

1.移除鏈表元素

【數(shù)據(jù)結(jié)構(gòu)】單鏈表經(jīng)典算法題的巧妙解題思路,數(shù)據(jù)結(jié)構(gòu)

【數(shù)據(jù)結(jié)構(gòu)】單鏈表經(jīng)典算法題的巧妙解題思路,數(shù)據(jù)結(jié)構(gòu)

?

?

2.反轉(zhuǎn)鏈表

【數(shù)據(jù)結(jié)構(gòu)】單鏈表經(jīng)典算法題的巧妙解題思路,數(shù)據(jù)結(jié)構(gòu)

【數(shù)據(jù)結(jié)構(gòu)】單鏈表經(jīng)典算法題的巧妙解題思路,數(shù)據(jù)結(jié)構(gòu)

?

?

3.鏈表的中間節(jié)點

【數(shù)據(jù)結(jié)構(gòu)】單鏈表經(jīng)典算法題的巧妙解題思路,數(shù)據(jù)結(jié)構(gòu)

【數(shù)據(jù)結(jié)構(gòu)】單鏈表經(jīng)典算法題的巧妙解題思路,數(shù)據(jù)結(jié)構(gòu)

?

?

4.合并兩個有序鏈表

【數(shù)據(jù)結(jié)構(gòu)】單鏈表經(jīng)典算法題的巧妙解題思路,數(shù)據(jù)結(jié)構(gòu)

【數(shù)據(jù)結(jié)構(gòu)】單鏈表經(jīng)典算法題的巧妙解題思路,數(shù)據(jù)結(jié)構(gòu)

?

?

5.環(huán)形鏈表的約瑟夫問題

【數(shù)據(jù)結(jié)構(gòu)】單鏈表經(jīng)典算法題的巧妙解題思路,數(shù)據(jù)結(jié)構(gòu)

【數(shù)據(jù)結(jié)構(gòu)】單鏈表經(jīng)典算法題的巧妙解題思路,數(shù)據(jù)結(jié)構(gòu)

?

【數(shù)據(jù)結(jié)構(gòu)】單鏈表經(jīng)典算法題的巧妙解題思路,數(shù)據(jù)結(jié)構(gòu)

?

我們來看看本篇要介紹的解法吧?

解析

這里介紹的解析僅供參考,算法題的實現(xiàn)思路是很多的,小編就不一一詳細介紹了,我們主要介紹小編認為比較好的方法~

題目1:創(chuàng)建新鏈表

思路:找值不為val的節(jié)點,尾插到新鏈表中

【數(shù)據(jù)結(jié)構(gòu)】單鏈表經(jīng)典算法題的巧妙解題思路,數(shù)據(jù)結(jié)構(gòu)

?pcur不等于val時,就把節(jié)點放在新鏈表中,新鏈表初始為空鏈表,所以新鏈表的第一個節(jié)點既是newhead也是newtail,放好后pcur往后走,繼續(xù)判斷節(jié)點是否等于val

【數(shù)據(jù)結(jié)構(gòu)】單鏈表經(jīng)典算法題的巧妙解題思路,數(shù)據(jù)結(jié)構(gòu)

?pcur所指向的節(jié)點不等于val,把這個節(jié)點尾插到新鏈表里面,newhead不變,newtail往后走,pcur也往后走,繼續(xù)判斷

【數(shù)據(jù)結(jié)構(gòu)】單鏈表經(jīng)典算法題的巧妙解題思路,數(shù)據(jù)結(jié)構(gòu)

?此時pcur指向的節(jié)點值為val,pcur再往后走,其余不變

【數(shù)據(jù)結(jié)構(gòu)】單鏈表經(jīng)典算法題的巧妙解題思路,數(shù)據(jù)結(jié)構(gòu)

一直到pcur遍歷完原鏈表,此時新鏈表就是去掉所有等于val值的節(jié)點的鏈表

【數(shù)據(jù)結(jié)構(gòu)】單鏈表經(jīng)典算法題的巧妙解題思路,數(shù)據(jù)結(jié)構(gòu)

?我們代碼實現(xiàn)一下

首先把結(jié)構(gòu)體類型 struct ListNode 換個名字,方便定義,就換成ListNode

typedef struct ListNode ListNode;

?然后在題目給的函數(shù)中進行實現(xiàn)

typedef struct ListNode ListNode;
struct ListNode* removeElements(struct ListNode* head, int val) 
{
	ListNode* newhead, * newtail;//定義新頭節(jié)點、新尾節(jié)點
	newhead = newtail = NULL;//新鏈表初始時為空
	ListNode* pcur = head;//pcur初始時指向原鏈表首節(jié)點
	while ()//開始遍歷鏈表
	{

	}
}

循環(huán)結(jié)束的條件應該是pcur不為NULL,循環(huán)體里面就是剛剛分析的過程

struct ListNode* removeElements(struct ListNode* head, int val) 
{
	ListNode* newhead, * newtail;//定義新頭節(jié)點、新尾節(jié)點
	newhead = newtail = NULL;//新鏈表初始時為空
	ListNode* pcur = head;//pcur初始時指向原鏈表首節(jié)點
	while (pcur)//開始遍歷鏈表
	{
		if (pcur->val != val)//找pcur不為val的節(jié)點
		{
			if (newhead == NULL)//新鏈表為空
			{
				newhead = newtail = pcur;
			}
			else//新鏈表不為空
			{
				newtail->next = pcur;
				newtail = newtail->next;
			}
		}
		pcur = pcur->next;//繼續(xù)往后遍歷
	}
	if(newtail)
	    newtail->next = NULL;
    return newhead;
}

?

?

題目2:巧用三個指針

參考思路1:依舊是新創(chuàng)建一個鏈表,遍歷原鏈表,將原鏈表中的節(jié)點采用頭插的形式放在新鏈表中,就可以實現(xiàn)鏈表的翻轉(zhuǎn)

參考思路2:創(chuàng)建3個指針,完成原鏈表的翻轉(zhuǎn)

我們來實現(xiàn)思路2,這個思路一般不太好想

創(chuàng)建3個變量,n1、n2、n3初始時分別指向NULL、節(jié)點1、節(jié)點2

【數(shù)據(jù)結(jié)構(gòu)】單鏈表經(jīng)典算法題的巧妙解題思路,數(shù)據(jù)結(jié)構(gòu)

然后讓n2指向n1,n1走到n2的位置,n2走到n3的位置,n3走向下一個節(jié)點

【數(shù)據(jù)結(jié)構(gòu)】單鏈表經(jīng)典算法題的巧妙解題思路,數(shù)據(jù)結(jié)構(gòu)

然后再重復上面的步驟,n2指向n1,n1走到n2的位置,n2走到n3的位置,n3走向下一個節(jié)點,

【數(shù)據(jù)結(jié)構(gòu)】單鏈表經(jīng)典算法題的巧妙解題思路,數(shù)據(jù)結(jié)構(gòu)

?走到這里的時候n3就不能繼續(xù)走了,n1和n2繼續(xù)走

【數(shù)據(jù)結(jié)構(gòu)】單鏈表經(jīng)典算法題的巧妙解題思路,數(shù)據(jù)結(jié)構(gòu)

此時n1就是鏈表的新頭節(jié)點

我們來代碼實現(xiàn),依舊是重命名一下,把結(jié)構(gòu)體類型 struct ListNode 換個名字,方便定義,換成ListNode

typedef struct ListNode ListNode;

然后在題目給的函數(shù)中實現(xiàn)

typedef struct ListNode ListNode;
struct ListNode* reverseList(struct ListNode* head) 
{
	ListNode* n1, * n2, * n3;//創(chuàng)建3個變量
	n1 = NULL;//給三個變量賦值
	n2 = head;
	n3 = n2->next;
	while (n2)
	{
		n2->next = n1;
		n1 = n2;
		n2 = n3;
		if(n3) //n3為不空時才繼續(xù)往后走
			n3 = n3->next;;
	}
	return n1;
}

這是鏈表不為空的情況,那鏈表為空時呢?直接返回?head 就可以了

typedef struct ListNode ListNode;
struct ListNode* reverseList(struct ListNode* head) 
{
	if (head == NULL) //空鏈表
		return head;
	//非空鏈表
	ListNode* n1, * n2, * n3;//創(chuàng)建3個變量
	n1 = NULL;//給三個變量賦值
	n2 = head;
	n3 = n2->next;
	while (n2)
	{
		n2->next = n1;
		n1 = n2;
		n2 = n3;
		if(n3) //n3為不空時才繼續(xù)往后走
			n3 = n3->next;;
	}
	return n1;
}

?

?

題目3:快慢指針

這道題的思路也很多,本篇想通過這題介紹一種很妙的方法,快慢指針,快慢指針在之后的很多題中也有很多應用

先來介紹一下快慢指針,slow表示慢指針,fast表示快指針

【數(shù)據(jù)結(jié)構(gòu)】單鏈表經(jīng)典算法題的巧妙解題思路,數(shù)據(jù)結(jié)構(gòu)

慢指針slow一次往后走一步,快指針fast一次往后走兩步

【數(shù)據(jù)結(jié)構(gòu)】單鏈表經(jīng)典算法題的巧妙解題思路,數(shù)據(jù)結(jié)構(gòu)

fast沒有走到空,繼續(xù)走,slow一次往后走一步,fast一次往后走兩步

【數(shù)據(jù)結(jié)構(gòu)】單鏈表經(jīng)典算法題的巧妙解題思路,數(shù)據(jù)結(jié)構(gòu)

fast不能再繼續(xù)往后走,此時slow所指向的節(jié)點就是鏈表的中間節(jié)點,這是節(jié)點個數(shù)為奇數(shù)的情況如果節(jié)點個數(shù)為偶數(shù)個呢?我們來看看

【數(shù)據(jù)結(jié)構(gòu)】單鏈表經(jīng)典算法題的巧妙解題思路,數(shù)據(jù)結(jié)構(gòu)

依舊是慢指針slow一次往后走一步,快指針fast一次往后走兩步

【數(shù)據(jù)結(jié)構(gòu)】單鏈表經(jīng)典算法題的巧妙解題思路,數(shù)據(jù)結(jié)構(gòu)

【數(shù)據(jù)結(jié)構(gòu)】單鏈表經(jīng)典算法題的巧妙解題思路,數(shù)據(jù)結(jié)構(gòu)

【數(shù)據(jù)結(jié)構(gòu)】單鏈表經(jīng)典算法題的巧妙解題思路,數(shù)據(jù)結(jié)構(gòu)

此時fast走到空了,不再繼續(xù)往后走,slow所指向的節(jié)點正是第二個中間節(jié)點

這就很簡單了,我們將快慢指針運用到題目中,代碼實現(xiàn)一下

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

這里需要注意:while循環(huán)里面的判斷條件 (fast && fast->next) 中 fast 不能和?fast->next 交換位置,因為如果鏈表結(jié)點個數(shù)是偶數(shù)個時,fast會走到NULL,當fast走到NULL時,while再對fast->next進行判斷,此時可以對空指針解引用嗎?不可以。所以fast->next不可以放在前面。當fast放在前面,此時fast為NULL,直接退出循環(huán),根本就不會對后面的表達式進行判斷,也就不會出現(xiàn)對空指針解引用的情況。

?

?

題目4:哨兵位節(jié)點

我們先說沒有哨兵位的代碼,哨兵位后面再分析

這題我們先選擇創(chuàng)建新鏈表,遍歷原鏈表,我們定義兩個指針遍歷兩個鏈表

【數(shù)據(jù)結(jié)構(gòu)】單鏈表經(jīng)典算法題的巧妙解題思路,數(shù)據(jù)結(jié)構(gòu)

值小的節(jié)點放在新鏈表中,相等的話隨便放哪個都行,然后讓相應的指針往后走一個【數(shù)據(jù)結(jié)構(gòu)】單鏈表經(jīng)典算法題的巧妙解題思路,數(shù)據(jù)結(jié)構(gòu)

此時L1和L2比較,L1比L2小,把L1的節(jié)點放到新節(jié)點,然后L1往后移

【數(shù)據(jù)結(jié)構(gòu)】單鏈表經(jīng)典算法題的巧妙解題思路,數(shù)據(jù)結(jié)構(gòu)

然后再依次向后比較,一直到L1或L2走到NULL為止,遍歷結(jié)果只有兩種情況,要么L1為空,要么L2為空

【數(shù)據(jù)結(jié)構(gòu)】單鏈表經(jīng)典算法題的巧妙解題思路,數(shù)據(jù)結(jié)構(gòu)

?我們代碼實現(xiàn)一下,先寫L1的值小于L2的值的時候

typedef struct ListNode ListNode;
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2)
{
	ListNode* L1 = list1; //遍歷原鏈表
	ListNode* L2 = list2;
	ListNode* newhead, * newtail; //創(chuàng)建新鏈表
	newhead = newtail = NULL;
	while (L1 && L2)//循環(huán)遍歷,有一個走到NULL就退出
	{
		if (L1->val < L2->val)//L1的節(jié)點值小
		{
			if (newhead == NULL) //新鏈表為空鏈表
			{
				newhead = newtail = L1;
			}
			else //新鏈表不為空鏈表
			{
				newtail->next = L1;//把L1放在新鏈表
				newtail = newtail->next;
			}
			L1 = L1->next;//L1往后走
		}
		else //L2的節(jié)點值小
		{

		}
	}
}

L2小于L1的時候也是類似的,此時while循環(huán)內(nèi)代碼為

	while (L1 && L2)//循環(huán)遍歷,有一個走到NULL就退出
	{
		if (L1->val < L2->val)//L1的節(jié)點值小
		{
			if (newhead == NULL) //新鏈表為空鏈表
			{
				newhead = newtail = L1;
			}
			else //新鏈表不為空鏈表
			{
				newtail->next = L1; //把L1放在新鏈表
				newtail = newtail->next;
			}
			L1 = L1->next;//L1往后走
		}
		else //L2的節(jié)點值小
		{
			if (newhead == NULL) //新鏈表為空鏈表
			{
				newhead = newtail = L2;
			}
			else //新鏈表不為空鏈表
			{
				newtail->next = L2;//把L2放在新鏈表
				newtail = newtail->next;
			}
			L2 = L2->next;//L2往后走
		}
	}

跳出循環(huán)后有兩種情況,要么L1先走到空,要么L2先走到空?,上面的情況就是L1走到空,L2沒有走到空,我們直接把L2拿下來尾插就行了,出while循環(huán)后的代碼如下

    //跳出循環(huán)后
    if (L2) //L2沒走到空
	    newtail->next = L2;
    if (L1) //L1沒走到空
	    newtail->next = L1;
return newhead;

我們還需要處理一下空鏈表的情況,空鏈表的情況代碼放在函數(shù)體最前面

	//空鏈表的情況
	if (list1 == NULL)
		return list2;
	if (list2 == NULL)
		return list1;

?

我們會發(fā)現(xiàn)代碼重復的部分很多,我們?nèi)绾稳?yōu)化它?首先要找為什么會重復

【數(shù)據(jù)結(jié)構(gòu)】單鏈表經(jīng)典算法題的巧妙解題思路,數(shù)據(jù)結(jié)構(gòu)

我們向操作系統(tǒng)申請一個空間,這個空間不存有效數(shù)據(jù)

newhead = newtail = (ListNode*)malloc(sizeof(ListNode));

此時鏈表也改變了

【數(shù)據(jù)結(jié)構(gòu)】單鏈表經(jīng)典算法題的巧妙解題思路,數(shù)據(jù)結(jié)構(gòu)

【數(shù)據(jù)結(jié)構(gòu)】單鏈表經(jīng)典算法題的巧妙解題思路,數(shù)據(jù)結(jié)構(gòu)

?所以現(xiàn)在的代碼就變了,返回值也變了

typedef struct ListNode ListNode;
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2)
{
	//空鏈表的情況
	if (list1 == NULL)
		return list2;
	if (list2 == NULL)
		return list1;
	ListNode* L1 = list1; //遍歷原鏈表
	ListNode* L2 = list2;
	ListNode* newhead, * newtail; //創(chuàng)建新鏈表
	newhead = newtail = (ListNode*)malloc(sizeof(ListNode));

	while (L1 && L2)//循環(huán)遍歷,有一個走到NULL就退出
	{
		if (L1->val < L2->val)//L1的節(jié)點值小
        {
	        newtail->next = L1; //把L1放在新鏈表
	        newtail = newtail->next;
	        L1 = L1->next;//L1往后走
        }
        else //L2的節(jié)點值小
        {
	        newtail->next = L2;//把L2放在新鏈表
	        newtail = newtail->next;
	        L2 = L2->next;//L2往后走
        }
	
	}
	//跳出循環(huán)后
	if (L2) //L2沒走到空
		newtail->next = L2;
	if (L1) //L1沒走到空
		newtail->next = L1;
	return newhead->next;
}

我們malloc的空間要記得釋放,所以可以在return上面加三排代碼,而且return的值也要改一下

    ListNode* ret = newhead->next;//存newhead->next的值
    free(newhead);
    newhead = NULL;
    return ret;

所以這里的頭節(jié)點就是哨兵位

【數(shù)據(jù)結(jié)構(gòu)】單鏈表經(jīng)典算法題的巧妙解題思路,數(shù)據(jù)結(jié)構(gòu)

?

題目5:環(huán)形鏈表

我們先介紹一下約瑟夫問題的歷史背景

據(jù)說著名猶太 歷史學家 Josephus( 弗拉維奧·約瑟夫斯 )有過以下的故事:在羅馬人占領喬塔帕特后,39 個猶太人與Josephus及他的朋友躲到一個洞中,39個猶太人決定寧愿死也不要被敵人抓到,于是決定了一個自殺方式,41個人排成一個圓圈,由第1個人開始報數(shù),每報數(shù)到第3人該人就必須自殺,然后再由下一個重新報數(shù),直到所有人都自殺身亡為止。約瑟夫?qū)⒆约汉退呐笥寻才旁?6和31個位置,于是逃脫了這場死亡游戲

來看一下環(huán)形鏈表

【數(shù)據(jù)結(jié)構(gòu)】單鏈表經(jīng)典算法題的巧妙解題思路,數(shù)據(jù)結(jié)構(gòu)

我們畫個圖簡單介紹一下

【數(shù)據(jù)結(jié)構(gòu)】單鏈表經(jīng)典算法題的巧妙解題思路,數(shù)據(jù)結(jié)構(gòu)

此時把3節(jié)點去掉,繼續(xù)從下一個存在的節(jié)點開始報數(shù)

【數(shù)據(jù)結(jié)構(gòu)】單鏈表經(jīng)典算法題的巧妙解題思路,數(shù)據(jù)結(jié)構(gòu)

再把節(jié)點1去掉,繼續(xù)從下一個存在的節(jié)點開始報數(shù)

【數(shù)據(jù)結(jié)構(gòu)】單鏈表經(jīng)典算法題的巧妙解題思路,數(shù)據(jù)結(jié)構(gòu)

把節(jié)點5去掉,現(xiàn)在留下兩個節(jié)點,如果約瑟夫和他的朋友想要存活,就要站在2或4的位置

【數(shù)據(jù)結(jié)構(gòu)】單鏈表經(jīng)典算法題的巧妙解題思路,數(shù)據(jù)結(jié)構(gòu)

?

那么這道題就是類似,不過是留下一個節(jié)點

5個節(jié)點,報數(shù)為2舉例

【數(shù)據(jù)結(jié)構(gòu)】單鏈表經(jīng)典算法題的巧妙解題思路,數(shù)據(jù)結(jié)構(gòu)

?【數(shù)據(jù)結(jié)構(gòu)】單鏈表經(jīng)典算法題的巧妙解題思路,數(shù)據(jù)結(jié)構(gòu)

【數(shù)據(jù)結(jié)構(gòu)】單鏈表經(jīng)典算法題的巧妙解題思路,數(shù)據(jù)結(jié)構(gòu)

最后就留下了節(jié)點3

代碼中我們?nèi)绾畏治瞿??看下圖。

【數(shù)據(jù)結(jié)構(gòu)】單鏈表經(jīng)典算法題的巧妙解題思路,數(shù)據(jù)結(jié)構(gòu)

數(shù)1之后數(shù)2,此時pcur后移,prev后移

【數(shù)據(jù)結(jié)構(gòu)】單鏈表經(jīng)典算法題的巧妙解題思路,數(shù)據(jù)結(jié)構(gòu)

pcur所指向的節(jié)點數(shù)到了2,要銷毀pcur所指的節(jié)點,銷毀的時候先讓prev的next指針指向pcur的next

【數(shù)據(jù)結(jié)構(gòu)】單鏈表經(jīng)典算法題的巧妙解題思路,數(shù)據(jù)結(jié)構(gòu)

然后把pcur指向的節(jié)點銷毀,并且讓pcur指向下一個節(jié)點,也就是prev的next指針指向的位置

【數(shù)據(jù)結(jié)構(gòu)】單鏈表經(jīng)典算法題的巧妙解題思路,數(shù)據(jù)結(jié)構(gòu)

然后繼續(xù)數(shù)數(shù),從1開始

【數(shù)據(jù)結(jié)構(gòu)】單鏈表經(jīng)典算法題的巧妙解題思路,數(shù)據(jù)結(jié)構(gòu)

【數(shù)據(jù)結(jié)構(gòu)】單鏈表經(jīng)典算法題的巧妙解題思路,數(shù)據(jù)結(jié)構(gòu)

然后就是重復步驟,當只剩下兩個節(jié)點時,分析一下

【數(shù)據(jù)結(jié)構(gòu)】單鏈表經(jīng)典算法題的巧妙解題思路,數(shù)據(jù)結(jié)構(gòu)

pcur報數(shù)為2,刪掉5這個節(jié)點,要先讓prev的next指針指向pcur的next,也就是節(jié)點3此時自己指向自己

【數(shù)據(jù)結(jié)構(gòu)】單鏈表經(jīng)典算法題的巧妙解題思路,數(shù)據(jù)結(jié)構(gòu)

然后再銷毀節(jié)點5,此時pcur也指向節(jié)點3?

【數(shù)據(jù)結(jié)構(gòu)】單鏈表經(jīng)典算法題的巧妙解題思路,數(shù)據(jù)結(jié)構(gòu)大概分析就是這樣,我們代碼實現(xiàn)一下

先寫一個創(chuàng)建節(jié)點的函數(shù)

 typedef struct ListNode ListNode;
 ListNode* BuyNode(int x)//創(chuàng)建節(jié)點
 {
    ListNode* node=(ListNode*)malloc(sizeof(ListNode));
    if(node==NULL)
    {
        exit(1);
    }
    node->val = x;
    node->next = NULL;
    return node;
 }

然后寫帶環(huán)鏈表的函數(shù)

 ListNode* CreatCircle(int n)//創(chuàng)建帶環(huán)鏈表
 {
    ListNode* phead=BuyNode(1);//先創(chuàng)建頭節(jié)點
    ListNode* ptail=phead;
    for (int i = 2; i <= n; i++)
    {
        ptail->next=BuyNode(i);//尾插新節(jié)點
        ptail = ptail->next;
    }
    ptail->next=phead;//頭尾相連,變成循環(huán)鏈表
    return ptail;
 }

然后在ysf函數(shù)中實現(xiàn)

int ysf(int n, int m )
{
   ListNode* prev = CreatCircle(n);//環(huán)形鏈表尾節(jié)點由prev接收
   ListNode* pcur = prev->next;//頭節(jié)點由pcur接收
   int count = 1;
   while (pcur->next != pcur)
   {
      if(count == m) //需要銷毀節(jié)點
      {
        prev->next = pcur->next;
        free(pcur);
        pcur = prev->next;
        count = 1;//重新計數(shù)
      }
      else //不用銷毀節(jié)點
      {
        prev = pcur;
        pcur = pcur->next;
        count++;
      }
   }
    return pcur->val;
}

?

?這次分享就到這里了,拜拜~

【數(shù)據(jù)結(jié)構(gòu)】單鏈表經(jīng)典算法題的巧妙解題思路,數(shù)據(jù)結(jié)構(gòu)

?

?

?

到了這里,關于【數(shù)據(jù)結(jié)構(gòu)】單鏈表經(jīng)典算法題的巧妙解題思路的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 【數(shù)據(jù)結(jié)構(gòu)與算法】單鏈表的排序算法(選擇,冒泡,遞歸)

    【數(shù)據(jù)結(jié)構(gòu)與算法】單鏈表的排序算法(選擇,冒泡,遞歸)

    目錄 選擇排序 冒泡排序 快速排序 合并兩條鏈表并排序 選擇排序 鏈表的選擇排序思想與數(shù)組的排序類似,但是鏈表需要先找到里面最小或者最大的值,然后將這個值用改鏈語句進行操作 我們先看這個改鏈語句的操作(min是筆者打錯了應該是max,但是圖已經(jīng)畫好了就沒有改)

    2024年02月04日
    瀏覽(32)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法】單鏈表的插入和刪除

    ?? 本文由 程序喵正在路上 原創(chuàng),CSDN首發(fā)! ?? 系列專欄: 數(shù)據(jù)結(jié)構(gòu)與算法 ?? 首發(fā)時間:2022年9月21日 ?? 歡迎關注??點贊??收藏??留言?? ?? 一以貫之的努力 不得懈怠的人生 眾所周知,順序表中的每個結(jié)點中只存放數(shù)據(jù)元素,其優(yōu)缺點為: 優(yōu)點:可隨機存取,存儲

    2024年02月07日
    瀏覽(25)
  • 【算法基礎】數(shù)據(jù)結(jié)構(gòu)| 單鏈表+雙鏈表 代碼實現(xiàn)+圖解+原理

    【算法基礎】數(shù)據(jù)結(jié)構(gòu)| 單鏈表+雙鏈表 代碼實現(xiàn)+圖解+原理

    博主簡介: 努力學習的預備程序媛一枚~ 博主主頁: @是瑤瑤子啦 所屬專欄: Java島冒險記【從小白到大佬之路】 因為瑤瑤子正在備戰(zhàn)藍橋杯和校內(nèi)ACM選拔賽,最近在學習算法相關的知識。我是借助 AcWing網(wǎng)站 來學習的,這篇文章是我學習就我學習內(nèi)容的一個筆記,其中的一些

    2024年02月01日
    瀏覽(139)
  • 【算法與數(shù)據(jù)結(jié)構(gòu)】 C語言實現(xiàn)單鏈表隊列詳解

    【算法與數(shù)據(jù)結(jié)構(gòu)】 C語言實現(xiàn)單鏈表隊列詳解

    前面我們學習了隊列的順序表的實現(xiàn),本節(jié)將用單鏈表實現(xiàn)隊列。 隊列也可以數(shù)組和鏈表的結(jié)構(gòu)實現(xiàn), 使用鏈表的結(jié)構(gòu)實現(xiàn)更優(yōu)一些,因為如果使用數(shù)組的結(jié)構(gòu),出隊列在數(shù)組頭上出數(shù)據(jù),效率會比較低 。下面我們先復習一下隊列的基本概念: 隊列:只允許在一端進行插入

    2024年04月11日
    瀏覽(94)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法】單鏈表的增刪查改(附源碼)

    【數(shù)據(jù)結(jié)構(gòu)與算法】單鏈表的增刪查改(附源碼)

    ? 這么可愛的貓貓不值得點個贊嗎 ???? 目錄 一.鏈表的概念和結(jié)構(gòu) 二.單鏈表的邏輯結(jié)構(gòu)和物理結(jié)構(gòu) 1.邏輯結(jié)構(gòu) ?2.物理結(jié)構(gòu) 三.結(jié)構(gòu)體的定義 四.增加 1.尾插? ?SListpushback 2.頭插? SListpushfront 五.刪除 1.尾刪? SListpopback 2.頭刪? SListpopfront 六.查找? 插入? 釋放? ?打印 1.查找

    2024年02月02日
    瀏覽(89)
  • 單鏈表的建立(頭插法、尾插法)(數(shù)據(jù)結(jié)構(gòu)與算法)

    單鏈表的建立(頭插法、尾插法)(數(shù)據(jù)結(jié)構(gòu)與算法)

    如果要把很多個數(shù)據(jù)元素存到一個單鏈表中,如何操作? 1.初始化一個單鏈表 2. 每次取一個數(shù)據(jù)元素,插入到表尾/表頭 尾插法建立的單鏈表元素順序與輸入數(shù)據(jù)集合的順序相同,即按照輸入數(shù)據(jù)的順序排列。 使用尾插法建立單鏈表的一個常見應用是在計算機科學中進行數(shù)據(jù)

    2024年04月11日
    瀏覽(24)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法】深入淺出:單鏈表的實現(xiàn)和應用

    【數(shù)據(jù)結(jié)構(gòu)與算法】深入淺出:單鏈表的實現(xiàn)和應用

    ? ??博客主頁:青竹霧色間. ??博客制作不易歡迎各位??點贊+?收藏+?關注 ?? 人生如寄,多憂何為? ? 目錄 前言 單鏈表的基本概念 節(jié)點 頭節(jié)點 尾節(jié)點 單鏈表的基本操作 創(chuàng)建單鏈表 頭插法: 尾插法: 插入(增)操作 ?刪除(刪)操作: 查找(查)操作: 修改(改

    2024年02月08日
    瀏覽(24)
  • C語言簡單的數(shù)據(jù)結(jié)構(gòu):單鏈表的有關算法題(2)

    C語言簡單的數(shù)據(jù)結(jié)構(gòu):單鏈表的有關算法題(2)

    接著我們介紹后面的三道題,雖然代碼變多了但我們的思路更加通順了 題目鏈接:https://leetcode.cn/problems/merge-two-sorted-lists/ 創(chuàng)建新鏈表,遍歷原鏈表,將節(jié)點值小的進行尾插到新鏈表中 這里要多次進行對NULL的判斷,開始傳入列表,中間newHead的判斷,循環(huán)出來一個為NULL的判斷

    2024年04月15日
    瀏覽(92)
  • 【一起學數(shù)據(jù)結(jié)構(gòu)與算法】快速教你了解并實現(xiàn)單鏈表

    【一起學數(shù)據(jù)結(jié)構(gòu)與算法】快速教你了解并實現(xiàn)單鏈表

    此篇是對單鏈表知識的學習和實現(xiàn),基本上大體的方法實現(xiàn)和思路都已經(jīng)表達,如果有不對的地方,還請各位大佬多多指教! 單鏈表是一種鏈式存取的數(shù)據(jù)結(jié)構(gòu),用一組地址任意的存儲單元存放線性表中的數(shù)據(jù)元素。鏈表中的數(shù)據(jù)是以結(jié)點來表示的,每個結(jié)點的構(gòu)成:元素

    2024年02月19日
    瀏覽(20)
  • 數(shù)據(jù)結(jié)構(gòu)(五)數(shù)據(jù)結(jié)構(gòu)與算法中的經(jīng)典題

    本文是在原本數(shù)據(jù)結(jié)構(gòu)與算法闖關的基礎上總結(jié)得來,加入了自己的理解和部分習題講解。至此數(shù)據(jù)結(jié)構(gòu)介紹已完結(jié),后續(xù)會把數(shù)據(jù)結(jié)構(gòu)算法題系列更完。 原活動鏈接 邀請碼: JL57F5 根據(jù)要求完成題目 Q1. (單選)以下哪些數(shù)據(jù)結(jié)構(gòu)支持隨機訪問? A. 數(shù)組 B. 單鏈表 C. 雙向鏈表

    2024年01月20日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包