python链表是否有环_结构之美:判断单链表中是否有环

有环的定义是,链表的尾节点指向了链接中间的某个节点。比如下图,如果单链表有环,则在遍历时,在通过6之后,会重新回到3,那么我们可以在遍历时使用两个指针,看两个指针是否相等。

15a57a7a1d64aa6b548a5f18ce5461c2.png

方法一:使用p、q两个指针,p总是向前走,但q每次都从头开始走,对于每个节点,看p走的步数是否和q一样。如图,当p从6走到3时,用了6步,此时若q从head出发,则只需两步就到3,因而步数不等,出现矛盾,存在环。

方法二:使用p、q两个指针,p每次向前走一步,q每次向前走两步,若在某个时候p == q,则存在环。

对于方法一,其实现代码为:

//if two pointer are equal, but they don't have the same steps, then has a loop

int HasLoop(LinkList L)

{

LinkList cur1 = L; // 定义结点 cur1

int pos1 = 0; // cur1 的步数

while(cur1){ // cur1 结点存在

LinkList cur2 = L; // 定义结点 cur2

int pos2 = 0; // cur2 的步数

pos1 ++; // cur1 步数自增

while(cur2){ // cur2 结点不为空

pos2 ++; // cur2 步数自增

if(cur2 == cur1){ // 当cur1与cur2到达相同结点时

if(pos1 == pos2) // 走过的步数一样

break; // 说明没有还

else // 否则

return 1; // 有环并返回1

}

cur2 = cur2->next; // 如果没发现环,继续下一个结点

}

cur1 = cur1->next; // cur1继续向后一个结点

}

return 0;

}

方法二则比较简单,就不注释了。

//using step1 and step2 here

//if exists a loop, then the pointer which use step2 will catch up with the pointer which uses step1

int HasLoop2(LinkList L)

{

int step1 = 1;

int step2 = 2;

Lin

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值