要求:
不允許修改鍊錶結構
時間複雜度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...