1、給定乙個鍊錶,判斷鍊錶中是否有環。
示例:
思路:
這道題還是利用快慢引用的思路,快的走一步,如果不為空,快的再走一步,慢的走一步,如果快引用的指向為空,說明無環,而如果快引用和慢引用的指向相等,說明有環。
具體**如下:
public
boolean
hascycle
(listnode head)
listnode fast = head;
listnode slow = head;do}
while
(fast!=null && fast!=slow);if
(fast==null)
return
true
;}
2、給定乙個鍊錶,返回鍊錶開始入環的第乙個節點。 如果鍊錶無環,則返回null。
思路:這道題是對上一題的擴充套件,就是在上一題的基礎上找環的入口點。方法很簡單,先找到相遇的節點,然後斷開,變成兩個鍊錶,這樣一來就變成了兩條鍊錶求交點的問題了,交點的位置就是環的入口點。
也就是說,定義兩個引用p1和p2,乙個從入口出發,乙個從快慢引用的相遇點出發,p1和p2相遇的位置就是環的入口點。
具體**如下:
public listnode detectcycle
(listnode head)
listnode fast = head;
listnode slow = head;do}
while
(fast != null && fast != slow);if
(fast == null)
listnode p1 = head;
listnode p2 = slow;
while
(p1 != p2)
return p1;
}
常考煉錶筆試題(一)
1 刪除鍊錶中等於給定值 val 的所有節點。示例 輸入 1 2 6 3 4 5 6,val 6 輸出 1 2 3 4 5 思路 要刪除鍊錶中等於給定值的所有節點,我們可以定義乙個結果鍊錶,再結合尾插的方法來實現。定義乙個last引用,指向結果鍊錶的最後乙個節點,cur引用指向給定鍊錶的第乙個節點。...
常考煉錶筆試題(三)
1 判斷是否是回文 思路 判斷乙個鍊錶是否是回文結構,我們可以先找到這個鍊錶的中間節點middle,然後將middle節點之後的鍊錶進行反轉,得到乙個新鍊錶。再定義兩個引用,分別指向原煉表和新鍊錶的第乙個節點,然後遍歷鍊錶,從第乙個結點開始比較,如果兩個引用的值不一樣,那麼就不是回文。過程如下 所以...
煉錶筆試題
反轉鍊錶 節點 class node object def init self,elem self.elem elem self.next none 鍊錶 class singlelist object def init self,head self.head head 反轉鍊錶 defrevers...