判斷乙個單鏈表是否有環及環入口

2021-09-26 02:04:31 字數 1122 閱讀 6378

要求:

不允許修改鍊錶結構

時間複雜度o(n),空間複雜度o(1)

判斷是否有環:

如果鍊錶有環,那麼在遍歷時則會陷入死迴圈。

使用快慢指標

快指標移動2步,慢指標移動1步

如果走到某一步,快慢指標相遇,則說明有環

環入口點:

我們假設鍊錶頭部到環入口距離 len, 環入口到快慢指標交匯點的距離為x,環的長度為r。環入口到快慢指標第一次交匯時,設慢指標走的長度為 d = len + x,快指標走的長度為 len + x + nr = 2d(因為快指標走2,慢指標走1),化簡 len = nr - x;

定義兩個指標cur和inter

cur指向單鏈表頭節點,inter指向快慢指標交匯點第一次相交的節點,cur和inter同時向後遍歷,第一次相交的點就是環的入口。

inter指標在遍歷過程中可能多次(n >= 1)經過環入口節點,但當cur指標第一次達到入口節點時,inter指標此時必然也指向入口節點。

解釋:鍊錶頭部到環入口的距離, 環入口到快慢指標交匯點的距離 ,加起來等於nr。相當於 鍊錶頭部->環入口->快慢指標交匯點可以形成乙個環。

#include using namespace std;

//結點

struct node

;//尾插法

node* create_list(int v, int len)

else

}slider->next = ret->next->next->next; //成環

return ret;//返回煉表頭結點

}void destory_list(node* list)

}void print_list(node* list)

cout << "null" << endl;

}node* listloop(node* list)

if(null == fast)

return null;

node* cur = list;

node* inter = slow;

while(cur != inter)

return cur;

}int main()

判斷乙個單鏈表是否有環及環

判斷乙個單鏈表是否有環及環的鏈結點 蒙恩的罪人 給定乙個單鏈表,只給出頭指標h 1 如何判斷是否存在環?2 如何知道環的長度?3 如何找出環的連線點在 4 帶環鍊錶的長度是多少?解法 1 對於問題1,使用追趕的方法,設定兩個指標slow fast,從頭指標開始,每次分別前進1步 2步。如存在環,則兩...

C 判斷乙個單鏈表是否有環及環長和環的入口點

1.為什麼寫這個隨筆?前幾天參加乙個電面,被問到這個問題,想總結一下。2.為什麼標題強調c 想在網上看看 卻沒找到c 版的,於是自己用c 實現一下。一 解決問題的思路 1.一種比較耗空間的做法是,從頭開始遍歷鍊錶,把每次訪問到的結點存入乙個集合 hashset 或字典 dictionary 如果發現...

判斷單鏈表是否有環及找環的入口

使用快慢指標,找到相遇節點 然後乙個指標指向頭節點,乙個指向相遇節點,一步步走直到兩個指標指向同乙個節點 即為環的入口點 include using namespace std typedef struct nodenode,linklist bool i istsloop linklist l r...