学习目标:
目标:熟练运用Java所学知识
学习内容:
本文内容:使用Java实现:环形链表Ⅱ
文章目录
- 学习目标:
- 学习内容:
- 题目描述:
- 解题步骤:
- 实现代码:
题目描述:
给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意,pos 仅仅是用于标识环的情况,并不会作为参数传递到函数中。
说明:不允许修改给定的链表。
示例 1:
输入:head = [3,2,0,-4], pos = 1
输出:返回索引为 1 的链表节点
解释:链表中有一个环,其尾部连接到第二个节点。
示例 2:
输入:head = [1,2], pos = 0
输出:返回索引为 0 的链表节点
解释:链表中有一个环,其尾部连接到第一个节点。
示例 3:
输入:head = [1], pos = -1
输出:返回 null
解释:链表中没有环。
解题步骤:
- 第一步:排除空链表和只有一个节点的情况
if(head==null||head.next==null){return null;}
while(fast!=null&&fast.next!=null){fast=fast.next.next;slow=slow.next;if(fast==slow){break;}}
- 第三步:如果链表没有环,则返回空
if(fast==null||fast.next==null){return null;}
- 第四步:链表带环,找到链表入环的第一个结点
如果链表带环,则 快慢指针相遇的结点 和 链表头结点 距离链表入环的第一个结点是相同的所以只需要同步遍历,直到第一次相遇既为链表入环的第一个结点
while(cur!=fast){cur=cur.next;fast=fast.next;}return fast;
实现代码:
public static ListNode detectCycle(ListNode head) {if(head==null||head.next==null){return null;}ListNode slow=head;ListNode fast=head;ListNode cur=head;while(fast!=null&&fast.next!=null){fast=fast.next.next;slow=slow.next;if(fast==slow){break;}}if(fast==null||fast.next==null){return null;}while(cur!=fast){cur=cur.next;fast=fast.next;}return fast;}