您的位置:首页 > 其它

LeetCode 141. Linked List Cycle

2016-10-06 00:00 281 查看

141. Linked List Cycle

Given a linked list, determine if it has a cycle in it.

Follow up:
Can you solve it without using extra space?

就是找链表是否有环,挺标准的算法,看了看leetcode解法还蛮多的

最简单想到的是用HashSet

public class Solution {
public boolean hasCycle(ListNode head) {
if(head==null)
return false;
Set<ListNode> set = new HashSet<>();
ListNode cur = head.next;
while(cur!=null){
if(set.contains(cur)){
return true;
}else{
set.add(cur);
cur=cur.next;
}

}
return false;

}
}

不适用任何extra space的话,还是蛮有难度的

第一种:破坏标记

将每一个遍历过的结点都做一个标记:将其指向头结点,那么如果遍历到一个结点指向头节点,说明有环

这个做法虽然是做到了只用constant space,但是会破坏原有链表,不算是好办法

public boolean hasCycle2(ListNode head) {
if(head == null || head.next == null) {
return false;
}
ListNode node = head;
while(node != null) {
if(node.next == head) {
return true;
}
ListNode temp = node.next;
node.next = head;
node = temp;
}
return false;
}

第二种:双指针快慢遍历(Floyd cycle detection algorithm)

用两个不同速度的指针来遍历链表,如果有环,那么这2个指针必定相遇

public class Solution {
public boolean hasCycle(ListNode head) {
if (head == null) return false;

ListNode slow = head;
ListNode fast = head;

while (fast.next != null) {
slow = slow.next;
fast = fast.next.next;

if (fast == null) return false;
if (slow == fast || slow == fast.next) return true;
}

return false;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  LeetCode LinkedList 算法