141. Linked List Cycle

来源:互联网 发布:c语言全集 编辑:程序博客网 时间:2024/05/21 08:58

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

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

思路:
判断一个链表是否有循环,天真(SB)的我以为循环链表是这样:
这里写图片描述

其实它也可能是这样的:

这里写图片描述

此处使用快慢指针的方法,设置两个指针p、q。每次p向前走一步,q向前走两步,p = p.next; q = q.next.next。就像两个人绕圈跑步,一个跑得快,一个跑得慢,总会在一个位置上相遇。

/** * 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) {        ListNode p = head, q = head;        boolean isCycle = false;        while(q != null && q.next != null) {            p = p.next;            q = q.next.next;            if(p == q) {                isCycle = true;                break;            }        }        return isCycle;    }}

扩展一下: 在两个指针p、q相遇后,p向前继续走,q留在原地,当pq再次相遇时,p走过的节点个数就是这个链表循环部分的节点个数。

原创粉丝点击