Leetcode 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?

分析

判断一个链表中是否有循环。一种方法是将链表指针依次保存在数组中,看下一个节点是否会在数组中出现,另一种方法是用两个指针,一个前进一步,另一个前进两步,如果存在循环,两个指针肯定有重合的时候。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
bool hasCycle(struct ListNode *head) {
    struct ListNode *array[100000];
    int num=0;
    struct ListNode *p=head;
    while(p!=NULL)
    {
        for(int i=0;i<num;i++)
        {
            if(p==array[i])
                return true;
        }
        array[num]=p;
        num++;
        p=p->next;
    }
    return false;
}
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
bool hasCycle(struct ListNode *head) {
    if(head==NULL)
        return false;
    struct ListNode *p1=head,*p2=head->next;
    while(p1!=NULL&&p2!=NULL)
    {
        if(p1==p2)
            return true;
        p1=p1->next;
        if(p2->next!=NULL)
            p2=p2->next->next;
        else
            p2=p2->next;
    }
    return false;
}

推荐阅读更多精彩内容