判斷乙個單鏈表是否存在環

2021-08-13 19:21:03 字數 1123 閱讀 8690

這是leetcode上面的一道簡單題【141. linked list cycle】,大約半個月前刷到的,當時沒想出來,直接看的solution,提到了hash表和快慢指標兩種演算法,覺得好複雜,然後放著沒有去想了。恰好導師有新的idea讓我試下,所以一放就放到現在,今天終於實現了。開薰。

這裡記錄兩種方法:快慢指標法和利用stl裡面的map或者set實現的方法(用stl的方法實際上和hash表的原理相似)。

原理:用乙個快指標和乙個慢指標去遍歷這個鍊錶,如果存在環的話,那麼快慢指標終有乙個時刻會相遇(可以自己畫乙個簡單的鍊錶走一遍,這裡因為markdown編輯器下傳不了【why???】,就不放了)。注:快指標和慢指標都從頭指標出發,快指標每次走兩步,慢指標每次走一步。

bool hascycle(listnode* head)

}//讀到鍊錶的尾了,跳出迴圈,說明沒有環了

return

false;

}

其實一開始是想實現利用hash表的演算法,但是查了半天沒查到c++裡面實現的std::hash怎麼用,想著map和hash_map很相似,所以想著就直接用map來實現了,利用的是map的insert插入時,如果key值已存在,則會插入失敗

-用map

//或者這裡使用maplist也行

//後面insert對應insert(pair(&(p->val),p->val))

mapint>

list;

listnode* p = head;

while (p!=null)

p = p->next;

}return

false;

-用set

實在覺得用map有些浪費,偶然發現leetcode提交的答案當中有用set的,豁然開朗,覺得當是如此。

set

list;

while (head)

head = head->next;

}return

false;

至此也算是又跨過了乙個小小的門檻,又進步了一點點,對鍊錶、map和set又熟悉了一些些吧。

判斷乙個單鏈表中是否存在環

判斷乙個單鏈表中是否存在 環。設定兩個指標 fast,slow 初始值都指向頭,slow每次前進1步,fast每次前進2步,大概的思路如下 如果鍊錶存在環,則fast必定先進入環,而slow後進入環,兩個指標必定相遇。如果鍊錶不存在環,則fast必定先指向null,而slow後指向null。如果存在...

判斷乙個單鏈表中是否存在環 Go

鍊錶的乙個結點的結構體如下 type lnode struct 對於乙個單鏈表,如果他要存在環,那麼至少存在兩個節點,也就是說最後乙個結點的next指向了前面的某個結點。所以在判斷鍊錶是否存在環的時候,我們新增快慢兩個指標fast和slow,fast指標每次向前走兩步,slow指標每次向前走一步,所...

判斷單鏈表是否存在環

有乙個單鏈表,其中可能有乙個環,也就是某個節點的next指向的是鍊錶中在它之前的節點,這樣在鍊錶的尾部形成一環。問題 1 如何判斷乙個鍊錶是不是這類鍊錶?2 如果鍊錶為存在環,如果找到環的入口點?解答 一 判斷鍊錶是否存在環,辦法為 設定兩個指標 fast,slow 初始值都指向頭,slow每次前進...