【发布时间】:2017-04-14 05:51:15
【问题描述】:
/**
* 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 问题不是关于使用循环链的链表实现,而是关于检测非循环链表的损坏链。
-
关于复杂性,为什么不同时拥有链表和集合呢?保持链表中项目的顺序并跟踪索引结构中的重复(循环)。那为什么不使用已经存在的LinkedHashSet<E>。已经实现和测试,如果你想添加任何自定义行为(比如抛出异常而不是在 add() 上返回 false),你可以继承它?
-
@andrei-macarie 双指针方法的一个优点是它不需要额外的内存(除了存储两个指针:-)。此外,它还通过快速指针与慢速指针相交(检测到循环)或快速指针到达列表末尾(无循环)在 O(n) 中找到答案。
-
@qwertyman 我明白了,所以这个问题是关于 - 我更关心内存而不是性能,其中复杂性不超过 O(n)。因此,该算法将与有限数量的元素一起使用,无论如何都会消耗低内存,但对于物联网时代,在便宜的设备上可能值得。现在我明白了:)
标签: java algorithm linked-list