[LeetCode] #141 环形链表
给定一个链表,判断链表中是否有环。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。
如果链表中存在环,则返回 true 。 否则,返回 false 。
输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。
HashSet是不允许有重复元素的集合,可以利用其性质完成这道题。
public class Solution { public boolean hasCycle(ListNode head) { Set<ListNode> node = new HashSet<ListNode>(); while (head != null) { if (!node.add(head)) { return true; } head = head.next; } return false; } }
也可以用快慢指针实现。在一个有环的结构里,一快一慢两个指针总会在某一时刻相遇
public class Solution { public boolean hasCycle(ListNode head) { if (head == null || head.next == null) { return false; } ListNode slow = head; ListNode fast = head.next; while (slow != fast) { if (fast == null || fast.next == null) { return false; } slow = slow.next; fast = fast.next.next; } return true; } }
知识点:
HashSet不能添加重复的元素,当调用add(Object)方法时候,如果元素不存在则插入并返回true,存在则直接返回false
总结:无