#include #include typedef struct linknode
linklist;
/*說明:都帶頭結點的單鏈表*/
/*建立鍊錶*/
void createlinklist(linklist* head, int* a, int n)
}/*判斷鍊錶是否為環,如果為環返回環的結點*/
bool iscirclelist(linklist* head, linknode* &headnode)
fast = fast->next;
slow = slow->next; /*慢指標走一步*/
if (fast == slow) /*相遇則跳出*/
}/*走到終點,返回false*/
if (fast == null)
/*可以證明:頭指標 到 環入口的距離 = 碰撞點p 到 環入口的距離 + 迴圈多次環*/
/*參考:
/*讓fast從起點開始走,讓slow繼續往下走,相遇點就是環的入口*/
fast = head;
while (fast != slow)
headnode = slow;
return true;
}/*k表示從第k個成環*/
bool createcirclelist(linklist* head, int k)
}if (k > 0)
lastnode->next = node;/*成環*/
return true;
}/*列印鍊錶*/
void printlinklist(linklist* head)
printf("\n");
}int main()
; linknode* node = null;
int a = ;
createlinklist(&head, a, 9);
printlinklist(&head);
createcirclelist(&head, 3);
iscirclelist(&head, node);
if (node != null)
return 0;
}
鍊錶是否成環
鍊錶是否成環 判斷鍊錶是否成環 快慢指標,快指標每次移動兩次,滿指標每次移動一次,如果鍊錶有環,快指標一定可以追上滿指標,對比生活中的跑步問題,乙個操場,跑的快的人一定可以追上跑的慢的人 package com.test public class node public boolean hascyc...
判斷單鏈表是否成環
成環 可以是迴圈單鏈表,即首位相連 也可以是部分成環,即尾部和其他節點相連。判斷是否成環 使用快慢指標遍歷鍊錶 慢指標 從頭節點開始,一次跳乙個節點。快指標 從頭節點開始,一次跳兩個節點。如果是成環的,這兩個指標一定會相遇。如上圖所示,藍色表示慢指標,紅色表示快指標,他們在經過4次遍歷後相遇,也就是...
力扣筆記 判斷鍊錶是否成環以及返回入環的第乙個節點
相遇的時候,慢指標走過的節點是 x y 快指標走過的節點是x n y z y 所以,2 x y x n y z y x z n 1 y z 也就是說 分別從頭節點和相遇節點處出發的兩個節點 temp1 temp2 每次移動乙個節點,一定會在入環節點處相遇。且移動的節點數 temp1是 x,temp2...