Linked List Cycle
Given a linked list, determine if it has a cycle in it.
Given -21->10->4->5, tail connects to node index 1, return true
Challenge?Follow up:
Can you solve it without using extra space?
分析
使用快慢指針
| 1234567891011121314151617181920212223242526272829 | /**?*?Definition?for?ListNode.?*?public?class?ListNode?{?*?????int?val;?*?????ListNode?next;?*?????ListNode(int?val)?{?*?????????this.val?=?val;?*?????????this.next?=?null;?*?????}?*?}?*/?public?class?Solution?{????/**?????*?@param?head:?The?first?node?of?linked?list.?????*?@return:?True?if?it?has?a?cycle,?or?false?????*/????public?boolean?hasCycle(ListNode?head)?{??????????//?write?your?code?here????????ListNode?slow?=?head,?fast?=?head;????????while(fast?!=?null?&&?fast.next?!=?null?&&?fast.next.next?!=?null){????????????slow?=?slow.next;????????????fast?=?fast.next.next;????????????if(slow?==?fast){????????????????return?true;????????????}????????}????????return?false;????}} |
1.判斷單鏈表是否有環
使用兩個slow, fast指針從頭開始掃描鏈表。指針slow 每次走1步,指針fast每次走2步。如果存在環,則指針slow、fast會相遇;如果不存在環,指針fast遇到NULL退出。
就是所謂的追擊相遇問題: 相遇時,slow 并沒有走完一圈,fast領先slow一圈,第一次相遇在Pos處
2.求有環單鏈表的環長
? 在環上相遇后,記錄第一次相遇點為Pos,之后指針slow繼續每次走1步,fast每次走2步。在下次相遇的時候fast比slow正好又多走了一圈,也就是多走的距離等于環長。
設從第一次相遇到第二次相遇,設slow走了len步,則fast走了2*len步,相遇時多走了一圈:?
環長=2*len-len。?
3.求有環單鏈表的環連接點位置
第一次碰撞點Pos到連接點Join的距離 = 頭指針到連接點Join的距離,因此,分別從第一次碰撞點Pos、頭指針head開始走,相遇的那個點就是連接點。
?
在環上相遇后,記錄第一次相遇點為Pos,連接點為Join,假設頭結點到連接點的長度為LenA,連接點到第一次相遇點的長度為x,環長為R。
第一次相遇時,slow走的長度 S =?LenA?+?x;
第一次相遇時,fast走的長度 2S =?LenA?+ n*R?+?x;
所以可以知道,LenA?+?x =??n*R; LenA = n*R -x; ?亦可以看成 LenA = m*R + y
4.求有環單鏈表的鏈表長
? 上述2中求出了環的長度;3中求出了連接點的位置,就可以求出頭結點到連接點的長度。兩者相加就是鏈表的長度。
null
轉載于:https://www.cnblogs.com/zhxshseu/p/f8973e488b1e794e4312d1915ba90381.html
總結
以上是生活随笔為你收集整理的Linked List Cycle的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Block的循环引用
- 下一篇: 《HTML5+CSS3网页设计入门必读》