赞
踩
成环链表与不成环链表相比,有一个很明显的差异
成环链表中是不存在尾节点的
所有节点中的指针都是指向下一节点的
根据这个差异,便可以很好的分辨链表分辨出来
该如何利用这个差异呢?
诺在一个成环链表中寻其尾节点,定为死循环
但设计程序时,也不能将程序设计成死循环。
如果利用快慢指针,便可以很好的解决这个问题
假设 fast 指针一步前进2个节点
slow 指针一步前进1个节点
fast定先进入环,此后便在环内不断变量,就像打转一样。
slow指针会在之后的某一个时刻进入环中
fast 相对于 slow 的相对速度为1
定会在某一时刻二者相遇
代码如下所示
bool hasCycle(struct ListNode *head) {
struct ListNode * slow = head;
struct ListNode * fast = head;
while(fast &&fast->next)
{
fast = fast->next->next;
slow = slow->next;
if(fast == slow)
return true;
}
return false;
}
给定一个链表,判断链表中是否有环。
leetCode 141
大体过程如下图所示
在探究这个问题之前,先来看一个数学问题
此问题建立在上一个问题的基础上
将指针前进一步抽象为单位长度
struct ListNode *detectCycle(struct ListNode *head) { struct ListNode * fast = head; struct ListNode * slow = head; while(fast && fast->next) { fast = fast->next->next; slow = slow->next; if(fast == slow) { struct ListNode * meet = head; while(slow != meet) { slow = slow->next; meet = meet->next; } return meet; } } return NULL; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。