带环链表

带环链表的判断及环入口的查找
题目:判断一个链表有没有带环,如果没带环返回null,如果带环请找出环的入口
方法一:
1、定义快慢两个引用,快引用一次走两步,慢引用一次走一步。(注;在代码上体现,一定要快引用走一步,然后判空,慢引用再走一步,快引用再走一步,否则会报:空指向引用)
2、如果快引用走到null了说明链表没有环,如果快引用与慢引用相遇了,说明此链表带环。
3、重新定义两个引用,一个指向头节点,一个指向快慢引用相遇的结点,两个引用同时往后走,当它们同时指向同一个结点时,这个结点就是环的入口。

推导:
设从头节点到相遇点的距离是L;从相遇点到慢引用的距离是C;从慢指针到相遇点的距离是R;
则:慢引用走的距离为L+C;快引用走的距离就为2*(L+C)(快引用走两步,慢引用走一步,所以快引用走的距离是慢引用的2倍)
所以:L=C(即从慢引用到相遇点的距离与从头节点到慢引用的距离相等)

源代码:
/判断一个链表是否有环如果有请找出环的起始点
static Node detectCycle(Node head) {
//求相遇点
//如果快的遇到NULL,表示没有环,直接返回NULL
//相遇点出发+起始出发,最终相遇
Node fast = head;
Node slow = head;
do {
if (fast == null)
return null;//没有环,返回null
fast = fast.next;
if(fastnull)
{
return null;
}
slow = slow.next;
fast=fast.next;
} while (fast != slow);//fast
slow,快慢引用相遇
Node cur = head;
Node p=slow;
while (p != cur) {
p = p.next;
cur = cur.next;
}
return cur;
}

方法二:
1、定义快慢两个引用,快引用一次走两步,慢引用一次走一步。(注;在代码上体现,一定要快引用走一步,然后判空,慢引用再走一步,快引用再走一步,否则会报:空指向引用)
2、如果快引用走到null了说明链表没有环,如果快引用与慢引用相遇了,说明此链表带环。
3、定义两个引用,一个引用指向快慢引用相遇的结点下一个结点,一个指向头节点,然后让快慢引用相遇的结点指向null,将问题转换成求两个链表的交点的问题。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值