演算法 鍊錶中環的入口結點

2021-07-11 14:59:39 字數 2158 閱讀 2277

乙個鍊錶中包含環,請找出該鍊錶的環的入口結點。

這個題目很經典:但是這種快慢指標的想法的原因我還沒有明白其中的由來;還有不明白為什麼快指標只能走2步,或者又是什麼道理,沒懂;

但是清楚的明白一點就是,快慢指標相遇的點一定是在環內,那麼根據這個點在環內轉圈再次遇到即就能得到環的大小n,也就是環中結點的個數;接著。讓指標1先走環的n步.然後指標2從頭結點開始走。則再次相遇即就是環的入口。

哇哦真的思維很巧妙,等我明白其中的道理來!

開始根據劍指offer書上寫的演算法如下:

package testmyselfe;

public class test56

public listnode(int val)

@override

public string tostring()

}//找到快慢指標相遇的結點在環內

public static listnode meetingnode(listnode phead)

listnode slow=phead;

listnode fast=phead;

while (fast!=null && slow!=null)

}if(fast==null&&slow==null)

return fast;}/*

* 在有環的鍊錶中找到環的入口結點的步驟:

* 1.指標p1和p2在初始化時都指向鍊錶的頭結點;

* 2.由於環中有4個結點,指標p1先在鍊錶上向前移動4步;

* 3.指標p1和p2以相同的速度在鍊錶上向前移動直到它們相遇。

* 它們相遇的結點就是環的入口結點;

*/public static listnode entrynodeofloop(listnode phead)

//得到結點中環的個數

int nodesinloop=1;

listnode node1=meetnode;

//得到環中的結點個數

while(node1.next!=meetnode)

//分別兩個指標開始行走

node1=phead;

//指標1先走

for (int i = 0; i < nodesinloop; i++)

listnode node2=phead;

//指標1和指標2同時一步步走,相遇即就是環的入口

while(node1!=node2)

return node1;

}public static void main(string args)

// 1->2->3->4->5->6

private static void test01()

// 1->2->3->4->5->6

// ^ |

// | |

// +--------+

}

後來發現還有更簡單的,意思就一樣,只不過就是不分開;先找到相遇點,接著乙個從頭走,乙個繼續走,一步一步,再次相遇即就是環的入口:

**如下:

package testmyselfe;

public class newtest56

public listnode(int val)

@override

public string tostring()

}/* * 1->2->3->4->5->6->3

* */

public listnode entrynodeofloop(listnode phead)

listnode slow=phead;

listnode fast=phead;

//快慢指標在鍊錶的找到相遇的點肯定在環內

while(slow!=null&&fast.next!=null)

} //鍊錶無環就是空

if(slow==null||fast.next==null)

listnode node1=phead;

//環內相遇點開始

listnode node2=slow;

//一步步再次相遇即就是環的入口

while(node1!=node2)

return node1;

}}

鍊錶中環的入口結點

乙個鍊錶中包含環,請找出該鍊錶的環的入口結點。class listnode public class solution return p1 return null 分析 假設鍊錶的起始點到環的入口點節點數為k,環的的節點數為x,讓p2的速度是p1的兩倍,p1和p2相遇在環的第y各節點,可以得到如下等...

鍊錶中環的入口結點

題目要求 乙個鍊錶中包含環,請找出該鍊錶的環的入口結點 分析 1 一種比較偷懶的方法就是遍歷鍊錶,並直接利用hashmap來儲存已經遍歷過的結點。一旦發現已經儲存過的結點,那麼該結點就是環的入口結點。2 參考自 我簡單畫了乙個圖 上傳之後一直是橫過來的。不知道為什麼轉不正 設定兩個指標p1和p2,乙...

鍊錶中環的入口結點

題目描述 乙個鍊錶中包含環,請找出該鍊錶的環的入口結點。思路1 設環中結點數是n,環的入口位置是x 距離起點走多少步 用快慢指標p,q,q移動的速度是p的2倍,當兩個指標相遇時p走的步數是y,q走的步數是2y,q比p多走k個環的距離,即 2y y kn,則y kn。p距離環的入口點的距離為y x,此...