給乙個鍊錶,若其中包含環,請找出該鍊錶的環的入口結點,否則,輸出null。
解題思路1. 判斷是否有環
2. 判斷環內結點個數k
3. 轉換為找到鍊錶的倒數第k個結點即入口結點(先走k步,然後快慢指標一起再次相遇即入口結點)
/*
public class listnode }*/
public class solution
// 1. 判斷是否有環
listnode p = hasloop(phead);
if (p == null)
// 2. 環中結點個數
int length = 1;
listnode q = p.next;
while (p != q)
// 3. 倒數第k個結點
return getkthnodefromlast(phead, length);
}public listnode getkthnodefromlast(listnode head, int k)
listnode pre = head;
while (pre != p)
return pre;
}public listnode hasloop(listnode head)
p = p.next;
if (q.next != null) else
}return null;
}}
劍指Offer 鍊錶中環的入口節點 23
給乙個鍊錶,若其中包含環,請找出該鍊錶的環的入口結點,否則,輸出null。第一步確定鍊錶中是否包含環,怎麼確定呢?我們定義兩個指標橙和藍,橙每次走一步,藍每次走兩步,如果他倆重合了,這就說明鍊錶中存在環。第二步求環的長度,兩者碰頭後,讓其中乙個繼續走,每走一步步數加一,然後求得環的長度。第三步求環的...
劍指Offer No 24 反轉鍊錶
輸入乙個鍊錶,反轉鍊錶後,輸出新鍊錶的表頭。建立乙個新的頭節點,將原鍊錶的所有結點通過頭插法插入新的頭節點之後。最終返回新的頭節點的next即為所求結果。public class listnode public class solution listnode newhead new listnode...
劍指offer23 鍊錶中環的入口節點
給乙個鍊錶,若其中包含環,請找出該鍊錶的環的入口結點,否則,輸出null。兩個指標,p1,p2 p1一次走一步,p2一次走兩步。第一次相遇之後開始計數,第二次再相遇時count的值就是環有多少個節點。兩個指標,p1,p2 p1先走count步,然後兩個再同時走,相遇的點就是入口節點。struct l...