判斷鍊錶是否成環,如果成環返回成環的第乙個結點

2021-06-28 09:27:29 字數 1120 閱讀 2606

#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...