/**
* Definition for singly-linked list.
* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public boolean hasCycle(ListNode head) {
if(head == null){
return false;
}
ListNode slow = head;
ListNode fast = head.next;
while((slow != null) && (fast != null) && (slow.next != null) && (fast.next != null)){
if(slow == fast){
return true;
}
slow = slow.next;
fast = fast.next.next;
}
return false;
}
}
對於檢測循環鏈表,我們使用2指針技術,速度慢,速度快。圓形鏈表邏輯
我的問題是,如果列表是圓形列表,我怎麼知道指針必須是在某個點相交?
順便說一句,在循環鏈表中不需要兩個指針,它主要用於實現隊列和斐波那契堆。當你到達第一個節點時,你停止遍歷。 –
@PorkkoM這個問題不是關於*使用*循環鏈,而是關於檢測非循環列表的損壞鏈的鏈表實現。 – Andreas
關於複雜性,爲什麼不同時有一個鏈表和一個集合?關注鏈接列表中項目的順序並跟蹤索引結構中的重複(循環)。那麼爲什麼不使用已經存在的[LinkedHashSet](https://docs.oracle.com/javase/8/docs/api/java/util/LinkedHashSet.html)。如果你想添加任何自定義行爲(如拋出異常,而不是在add()上返回false),那麼已經實現並測試過了,你可以繼承它嗎? –
andreim