13 單鏈表中,取出環的起始點

2022-05-10 10:42:09 字數 2641 閱讀 5331

我們平時碰到的有環鏈表是下面的這種:(圖1)

上圖中環的起始點1。 

但有可能也是下面的這種:(圖2)

此時,上圖中環的起始點是2。 

方法1: 

這裡我們需要利用到上面第8小節的取出環的長度的方法getcyclelength,用這個方法來獲取環的長度length。拿到環的長度length之後,需要用到兩個指標變數first和second,先讓second指標走length步;然後讓first指標和second指標同時各走一步,當兩個指標相遇時,相遇時的結點就是環的起始點。 

注:為了找到環的起始點,我們需要先獲取環的長度,而為了獲取環的長度,我們需要先判斷是否有環。所以這裡面其實是用到了三個方法。 **實現: 

方法1的核心**:

//

方法:獲取環的起始點。引數length表示環的長度

public node getcyclestart(node head, int

cyclelength)

node first =head;

node second =head;

//先讓second指標走length步 

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

//然後讓first指標和second指標同時各走一步

while (first != null && second != null

) }

return

null

; }

完整版**:(含測試部分)

public

class

linkcyclestart

else

}//方法過載:向鍊錶中新增結點

public

void

add(node node)

if (head == null

) else

}//方法:遍歷鍊錶(列印輸出鍊錶。方法的引數表示從節點node開始進行遍歷

public

void

print(node node)

current =node;

while (current != null

) }

class

node

public

intgetdata()

public

void setdata(int

data)

public

node getnext()

public

void

setnext(node next)

}//方法:檢測單鏈表是否有環

public

node hascycle(node head)

node first =head;

node second =head;

while (second != null

) }

return

null

; }

//方法:有環鏈表中,獲取環的長度。引數node代表的是相遇的那個結點

public

intgetcyclelength(node node)

current =node;

int length = 0;

while (current != null

) }

return

length;

}//方法:獲取環的起始點。引數length表示環的長度

public node getcyclestart(node head, int

cyclelength)

node first =head;

node second =head;

//先讓second指標走length步 

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

//然後讓first指標和second指標同時各走一步

while (first != null && second != null

) }

return

null

; }

public

static

void

main(string args)

}list1.add(second);

//將尾結點指向鍊錶的第二個結點,於是單鏈表就有環了

node current1 = list1.hascycle(list1.head);//

獲取相遇的那個結點

int length =list1.getcyclelength(current1);

system.out.println("環的起始點是" +list1.getcyclestart(list1.head, length).data);}}

測試結果:

環的起始點是2

單鏈表中的環

問題一 鍊錶中是否存環?問題二 鍊錶中環的入口結點是哪個?問題三 鍊錶中環的結點數目 環的長度 是多少?解答思路 問題一 如果有兩個頭結點指標,乙個走的快,乙個走的慢,那麼若干步以後,快的指標總會超過慢的指標一圈。問題二 假設問題一中兩個不同步速遍歷的指標為p和q,其中p的步速為2,q的步速為1,假...

單鏈表中的環(總結)

當fast和slow相遇時,slow還沒有走完鍊錶,假設fast已經在環內迴圈了n 1 n 圈。假設slow走了s步,則fast走了2s步,又由於 fast走過的步數 s n r s 在環上多走的n圈 則有下面的等式 2 s s n r 1 s n r 2 如果假設整個鍊錶的長度是l,入口和相遇點的...

找出有環鏈表中環的起始節點

給定乙個有環的鍊錶,寫乙個演算法,找出環的起點。例如 輸入 a b c d e c 與前面的c是同乙個節點 輸出 c 判斷乙個鍊錶是否存在環有乙個簡單的方法,就是使用乙個快指標 和乙個慢指標,快指標每次走兩步,慢指標每次走一步,則如果有環,它們最後必然會相遇的。本題的難點在於要找出環的起點。其實也不...