給定乙個單鏈表,只給出頭指標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 ...