生活随笔
收集整理的這篇文章主要介紹了
【☘️C语言の单链表是否有环问题☘️】
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
問(wèn)題:
給定一個(gè)單鏈表,只給出頭指針,如何判斷是否存在環(huán)?
思路:
使用快慢指針?lè)?/strong>。
使用兩個(gè)指針(快指針(fast)、慢指針(slow))從鏈表頭開(kāi)始遍歷此單鏈表。快指針每次走兩步,慢指針每次走一步。
如果有環(huán):快指針和慢指針會(huì)相遇;
如果無(wú)環(huán):快指針走到單鏈表尾部,遇到NULL退出。
類(lèi)比思維:
就是小學(xué)數(shù)學(xué)經(jīng)常考的龜🐢兔🐰賽跑追擊相遇問(wèn)題:
小兔子🐰速度快,小烏龜🐢速度為慢。它們從起點(diǎn)一起出發(fā),賽道如果有環(huán),他們一定都會(huì)在環(huán)里不停地跑,它們總歸相遇;如果賽道沒(méi)有環(huán),小兔子🐰肯定很早就達(dá)到終點(diǎn),比賽結(jié)束啦。
代碼:
以下圖單鏈表為例
#include <stdio.h>
#include <stdlib.h>typedef struct node {int value
;struct node *next
;
}LinkNode
, *Linklist
;Linklist
createList();
int deleteList(Linklist head
, LinkNode
* cyclestartnode
);
LinkNode
* judgeCycle(Linklist head
);
int getLenHead2CycleStart(Linklist head
, LinkNode
*cycleMeetNode
);
LinkNode
* CycleStart(Linklist head
, int len
);
LinkNode
* getCycleStartNode(Linklist head
); int main()
{Linklist list
= NULL; LinkNode
*cycleMeetNode
= NULL; LinkNode
*cycleStartNode
= NULL; int Len
= 0;int cycleLength
= 0;list
= createList();cycleMeetNode
= judgeCycle(list
); if (cycleMeetNode
== NULL){printf("No Cycle\n");}else{printf("Have Cycle\n");cycleStartNode
= getCycleStartNode(list
);}deleteList(list
, cycleStartNode
); return 0;
}
Linklist
createList()
{Linklist head
= NULL;LinkNode
*preNode
= head
;LinkNode
*tailNode
= NULL;int i
= 0;for (i
= 0; i
< 7; i
++){LinkNode
*pLinkNode
= (LinkNode
*)malloc(sizeof(LinkNode
));pLinkNode
->value
= i
;pLinkNode
->next
= NULL;if (preNode
== NULL){head
= pLinkNode
;preNode
= head
;}else{preNode
->next
= pLinkNode
;preNode
= pLinkNode
;}if (3 == i
){tailNode
= pLinkNode
;}}preNode
->next
= tailNode
;return head
;
}
int deleteList(Linklist head
, LinkNode
* cyclestartnode
)
{int isCycleStartFlag
= 0; LinkNode
*nextnode
= NULL;while (head
!= NULL){nextnode
= head
->next
;if (head
== cyclestartnode
){if (1 == isCycleStartFlag
){break; }else{isCycleStartFlag
= 1; }}free(head
);head
= nextnode
;}return 0;
}
LinkNode
* judgeCycle(Linklist head
)
{LinkNode
*fastNode
= head
;LinkNode
*slowNode
= head
;if (head
== NULL){return NULL;}while (1){if (slowNode
->next
!= NULL && fastNode
->next
!= NULL && fastNode
->next
->next
!= NULL){slowNode
= slowNode
->next
; fastNode
= fastNode
->next
->next
; }else{return NULL;}if (fastNode
== slowNode
){return fastNode
;}}return NULL;
}
int getLenHead2CycleStart(Linklist head
, LinkNode
*cycleMeetNode
)
{int lenA
= 0;LinkNode
*aNode
= head
; LinkNode
*bNode
= cycleMeetNode
; while (1){aNode
= aNode
->next
;bNode
= bNode
->next
;lenA
++;if (aNode
== bNode
)break;}return lenA
;
}
LinkNode
* CycleStart(Linklist head
, int len
)
{if (!head
|| len
<= 0){return NULL;}int i
= 0;LinkNode
* tmp
= head
;for (; i
< len
; ++i
){if (tmp
!= NULL){tmp
= tmp
->next
;}}return (i
== len
) ? tmp
: NULL;
}
LinkNode
* getCycleStartNode(Linklist head
)
{LinkNode
*fastNode
= head
;LinkNode
*slowNode
= head
;int isHaveCycle
= 0;if (NULL == head
){return NULL;}while (slowNode
->next
&& fastNode
->next
&& fastNode
->next
->next
){slowNode
= slowNode
->next
;fastNode
= fastNode
->next
->next
;if (slowNode
== fastNode
){isHaveCycle
= 1;break;}}if (1 == isHaveCycle
){slowNode
= head
;while (slowNode
!= fastNode
){slowNode
= slowNode
->next
;fastNode
= fastNode
->next
;}return slowNode
;} else{return NULL;}
}
打印信息:
Have Cycle
引經(jīng)據(jù)典
http://blog.sina.com.cn/s/blog_725dd1010100tqwp.html
http://www.cnblogs.com/xudong-bupt/p/3667729.html
總結(jié)
以上是生活随笔為你收集整理的【☘️C语言の单链表是否有环问题☘️】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。