141. 环形链表

28 阅读2分钟

141. 环形链表

简单

相关标签

premium lock icon相关企业

给你一个链表的头节点 head ,判断链表中是否有环。

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。

如果链表中存在环 ,则返回 true 。 否则,返回 false 。

 

示例 1:

输入: head = [3,2,0,-4], pos = 1
输出: true
解释: 链表中有一个环,其尾部连接到第二个节点。

示例 2:

输入: head = [1,2], pos = 0
输出: true
解释: 链表中有一个环,其尾部连接到第一个节点。

示例 3:

输入: head = [1], pos = -1
输出: false
解释: 链表中没有环。

 

提示:

  • 链表中节点的数目范围是 [0, 104]
  • -105 <= Node.val <= 105
  • pos 为 -1 或者链表中的一个 有效索引 。

题解:

写好常用的链表处理函数(维护shead中的size值,一加入新的节点后马上自增,不能早不能晚),快慢指针遍历size,过程中遇到NULL尽头或者遍历完仍然不相遇就是没环。

#include <stdio.h>
#include <stdlib.h>

typedef struct ListNode{
    int val;
    struct ListNode* next;
} ListNode;

ListNode* InitList()
{
    ListNode* shead = (ListNode*)malloc(sizeof(ListNode));
    shead->val = 0;
    shead->next = NULL;
    return shead;
}

void AddAtEnd(ListNode* shead, int val)
{
    ListNode* now = shead;
    while (now->next != NULL)
    {
        now = now->next;
    }
    now->next = (ListNode*)malloc(sizeof(ListNode));
    now->next->val = val;
    now->next->next = NULL;
    shead->val ++;
    return;
}

int main()
{
    ListNode* shead;
    ListNode* work;
    shead = InitList();
    work = shead;
    AddAtEnd(shead, 1);
    // AddAtEnd(shead, 2);
    // AddAtEnd(shead, 0);
    // AddAtEnd(shead, 4);
    while (work->next != NULL)
    {
        work = work->next;
    }
    //首尾连环
    // work->next = shead->next;

    ListNode* fast;
    ListNode* slow;
    fast = shead;
    slow = shead;
    int i;
    for (i = 1;i <= shead->val;i ++)
    {
        if (slow->next != NULL && fast->next != NULL && fast->next->next != NULL)
        {
            slow = slow->next;
            fast = fast->next->next;
        }
        else break;
        if (fast == slow)
        {
            printf("true");
            break;
        }
    }
    if (fast == shead || fast != slow)
    {
        printf("false");
    }
    

    return 0;
}