鍊錶的乙個結點的結構體如下:
type lnode struct
對於乙個單鏈表,如果他要存在環,那麼至少存在兩個節點,也就是說最後乙個結點的next指向了前面的某個結點。
所以在判斷鍊錶是否存在環的時候,我們新增快慢兩個指標fast和slow,fast指標每次向前走兩步,slow指標每次向前走一步,所以相對來說,fast指標相對slow指標每次向前走了一步。
兩種情況,一種是不存在環,另一種是存在環:
不存在環:
這是乙個單鏈表,如果不存在環,那麼fast指標肯定會先走到鍊錶末尾,此時就說明了鍊錶不存在環
存在環:
fast不會走到鍊錶末尾,因為存在環的鍊錶不存在末尾,此時fast會先走進環中,然後slow會後走進環中,因為fast每次相對slow多走一步,所以當fast和slow都在環中以後,經過某個步數的行走,fast肯定會追上slow,此時就說明了鍊錶存在環
func checklinklistring(l *lnode) bool elseslow = slow.next
if fast == slow
} return false
}func main()
l2 := lnode
l3 := lnode
l4 := lnode
l5 := lnode
l6 := lnode
l1.next = &l2
l2.next = &l3
l3.next = &l4
l4.next = &l5
l5.next = &l6
l6.next = &l3
fmt.println(checklinklistring(&l1))
}
判斷乙個單鏈表中是否存在環
判斷乙個單鏈表中是否存在 環。設定兩個指標 fast,slow 初始值都指向頭,slow每次前進1步,fast每次前進2步,大概的思路如下 如果鍊錶存在環,則fast必定先進入環,而slow後進入環,兩個指標必定相遇。如果鍊錶不存在環,則fast必定先指向null,而slow後指向null。如果存在...
判斷乙個單鏈表是否存在環
這是leetcode上面的一道簡單題 141.linked list cycle 大約半個月前刷到的,當時沒想出來,直接看的solution,提到了hash表和快慢指標兩種演算法,覺得好複雜,然後放著沒有去想了。恰好導師有新的idea讓我試下,所以一放就放到現在,今天終於實現了。開薰。這裡記錄兩種方...
單鏈表中判斷是否存在環
有乙個單鏈表,其中可能有乙個環,也就是某個節點的next指向的是鍊錶中在它之前的節點,這樣在鍊錶的尾部形成一環。1 如何判斷乙個鍊錶是不是這類鍊錶?2 如果鍊錶為存在環,如果找到環的入口點?擴充套件 判斷兩個單鏈表是否相交,如果相交,給出相交的第乙個點。有乙個單鏈表,其中可能有乙個環,也就是某個節點...