判断一个链表是否有环,直接使用两个指针,一个一次走一步,一个一次两步,然后往后面开始遍历,如果相遇的话,就肯定有环。
int SListHasCycle(SList
* plist
)
{
SListNode
* fast
= plist
->_head
;
SListNode
* slow
= plist
->_head
;
while (slow
&& fast
&& fast
->_next
)
{
slow
= slow
->_next
;
fast
= fast
->_next
->_next
;
if (slow
== fast
)
{
return 1;
}
return 0;
}
}
返回环的结点位置:一个指针从相遇点开始跑,一个指针从起点开始跑,相等之后就找到了(相当于分叉链表的交点) 然后返回这个结点,没找到就返回空
SListNode
* detectCycle(SList
* plist
)
{
SListNode
* tmp
= SListGetCycle(plist
);
if (tmp
)
{
return NULL;
}
SListNode
* cur
= plist
->_head
;
for (; cur
; cur
= cur
->_next
, tmp
= tmp
->_next
)
{
if (cur
== tmp
)
{
return cur
;
}
}
return NULL;
}