我們平時碰到的有環鏈表是下面的這種:(圖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 判斷乙個鍊錶是否存在環有乙個簡單的方法,就是使用乙個快指標 和乙個慢指標,快指標每次走兩步,慢指標每次走一步,則如果有環,它們最後必然會相遇的。本題的難點在於要找出環的起點。其實也不...