剑指offer_链表---链表中环的入口结点

##题目描述
一个链表中包含环,请找出该链表的环的入口结点。
##解题思路
1,使用快慢指针找到碰撞点
2,两个同速指针分别从头节点和碰撞点出发,相遇的地方就是入口节点
##代码实现

/**
 * 
 */
package 链表;

/**
 * <p>
 * Title:EntryNodeOfLoop
 * </p>
 * <p>
 * Description:
 * </p>
 * 
 * @author 田茂林
 * @data 2017年8月23日 上午9:25:08
 */
public class EntryNodeOfLoop {
	public ListNode NodeEntryNodeOfLoop(ListNode pHead) {
		if (pHead == null) {
			return null;
		}
		// 先找到碰撞点,两个指针出发,一快一慢
		ListNode fast = pHead;
		ListNode slow = pHead;
		if (fast == null || fast.next == null) {
			return null;     //因为下边的循环要用到fast.next,所以不能为null
		}
		while (fast != null) {   //因为函数体里没有用到fast.next做判断,只有赋值操作,所以不需要对其做非空判断。
			fast = fast.next.next;
			slow = slow.next;//slow的速度比fast慢,所以不用判断slow是否非空
			if (fast == slow)
				break;
		}
		// 速度一样的两个指针一个从pHead出发,一个从碰撞点出发,相遇的地方就是入口节点
		slow = pHead;
		while (slow != fast) {
			slow = slow.next;
			fast = fast.next;
		}
		return slow;

	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

存在morning

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值