简单
相关标签
相关企业
给你一个链表的头节点 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 <= 105pos为-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;
}