什么是环形链表
答:环形链表是一种特殊类型的链表数据结构,其最后一个节点的"下一个"指针指向链表中的某个节点,形成一个闭环。
形式多为:为一种闭环模式
1.环形链表的判断
代码:该代码使用了快慢指针,如果slow==fast,则存在环形链表,反之则不存在
slow一次走一步,fast一次走多步
bool hasCycle(struct ListNode *head) {
//找到相遇点
struct ListNode*slow = head;
struct ListNode*fast = head;
struct ListNode*meet = NULL;
while(fast&&fast->next)
{
slow = slow->next;
fast = fast->next->next;
if(slow==fast)
{
return true;
}
}
return false;
}
其中会涉及到追击问题
1.当slow走1步,fast走2 3 4 5 。。。。是否一定会追上?
答案是一定可以追上
解析如下
2.环形链表第一个节点的查找
代码:
struct ListNode *detectCycle(struct ListNode *head) {
struct ListNode*slow = head;
struct ListNode*fast = head;
struct ListNode*meet = NULL;//相遇指针
struct ListNode*newhead = head;//新头指针
while(fast&&fast->next)
{
//找到相遇结点,赋值给meet
slow = slow->next;
fast = fast->next->next;
if(slow==fast)
{
meet = slow;
//meet和newhead一起走,相遇点为环的第一个节点,下面主要为证明此事
while(newhead!=meet)
{
meet = meet->next;
newhead = newhead->next;
}
return newhead;
}
}
return NULL;
}
图示:
设环的第一个节点距离相遇点距离为:N
从头节点到环的第一个节点为:L
环的周长为:C
从相遇点到第一个节点距离为:C-N
证明:
到此证明完毕:从头结点到环的第一个节点的距离==从相遇点到环的第一个节点的距离