單鏈表的環相關問題

2021-06-21 21:37:32 字數 1652 閱讀 5499

給定乙個單鏈表,只給出頭指標h:

1、 如何判斷是否存在環?

證明:

slow首次在a點進入環路時,fast一定在環中的b點某處。設此時slow距head長為x,b點距a點長度為y,環周長為s。因為fast和slow的步差為1,所以slow前行距離為y的時候,恰好會被fast在m點追上。因為y2、 如何知道環的長度?

證明:(有公式所以截圖了)

//返回環的長度

public static int cyclelength(listnode head)

listnode slow = head;

listnode fast = head;

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

return length;

}} return 0;

}

3、 如何找出環的連線點在**?證明:在fast和slow第一次相遇的時候,假定slow走了n步驟,環路的入口是在x步的時候經過的,那麼有

slow走的路徑: x+y = n;   y為fast和slow相交點m距離環路入口的距離

fast走的路徑: x+y+k*s = 2*n;   s為環路的周長,k是整數

所以得出 n = k*s;

顯然,如果從x+y點開始,slow再走n步的話,還可以回到x+y這個點(繞了k圈)

同時另乙個指標temp從頭開始走的話,經過n步,也會達到x+y這點

兩者都減去y步,可知兩者走x步必然會在環路的入口點處相遇

//找出環的起始點在**

public static listnode getcyclestartnode(listnode head)

listnode slow = head;

listnode fast = head;

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

return slow;}}

return null;

}

4、帶環鍊錶的長度是多少?證明:總長度 = s + x;

//帶環鍊錶總長度,0表示沒環

public static int getlistlength(listnode head)

listnode slow = head;

listnode fast = head;

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

lengths = lengthx;

while(slow != p)

return lengthx+lengths;}}

return 0;

}

單鏈表 與 環 的相關問題

感謝這個哥的總結。問題 對於問題1 2 3,思考如何給出嚴謹的數學證明呢?給定乙個單鏈表,只給出頭指標h 1 如何判斷是否存在環?2 如何知道環的長度?3 如何找出環的連線點在 4 帶環鍊錶的長度是多少?給定兩單鏈表a b,只給出兩頭指標。請問 5 如何判斷兩單鏈表 無環 是否相交?6 如何判斷兩單...

單鏈錶環問題

給定乙個單鏈表,只給出頭指標h 1 如何判斷是否存在環?2 如何知道環的長度?3 如何找出環的連線點在 4 帶環鍊錶的長度是多少?5 如果存在環,求出環上距離任意乙個節點最遠的點 對面節點 6 擴充套件 如何判斷兩個無環鏈表是否相交 7 擴充套件 如果相交,求出第乙個相交的節點 解法 1 對於問題1...

單鏈表成環問題

思路一 新建乙個unordered set 思路二 兩個指標,乙個走得乙個走得慢,如果相遇了肯定是有環的,參考 思路一 class solution return false 思路二 include include include includeusing namespace std struct ...