141. Linked List Cycle - Java

版权声明:All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally. 本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/murasakino/article/details/90020728

141. Linked List Cycle

https://leetcode.com/problems/linked-list-cycle/

Description

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

Solutions

https://leetcode.com/problems/linked-list-cycle/solution/
Approach 1 两个指针

与操场跑步类似,如果没有环形,那么跑的快的最后会到达终点(单跑道),有环形的话,跑的快的最终会追上慢的。
设置两个指针p1和p2,每次p1向前走一步,p2向前走两步,直到p2碰到NULL或者两个指针相等时结束循环。
如果两个指针相等,说明该链表存在环。

Approach 2 : hash table

把节点存放的地址读取出来,存放进哈希表中,指针后移直到指针指向NULL或者发现哈希表中有地址重复的地方停止,如果发现重复地址,则该指针即为环的出口地址。

Submissions

/**
 * 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||head.next==null)
            return false;
        ListNode slow=head;
        ListNode fast=head.next;
        while(slow!=fast)//当fast追上next的时候就是环
        {
            if(fast==null||fast.next==null)
            return false;               
            slow=slow.next;//为什么差了两个,是因为fast跑得快,一次跑两步,所以只需判断fast和fast.next为不为空
            fast=fast.next.next;
        }
        return true;
    }
}
public boolean hasCycle(ListNode head) {
    Set<ListNode> nodesSeen = new HashSet<>();
    while (head != null) {
        if (nodesSeen.contains(head)) {
            return true;
        } else {
            nodesSeen.add(head);
        }
        head = head.next;
    }
    return false;
}

Summary

判断单链表是否存在环形链表问题

猜你喜欢

转载自blog.csdn.net/murasakino/article/details/90020728