[编程题]链表中环的入口结点
一个链表中包含环,请找出该链表的环的入口结点。
参考:点击打开链接
public class 链表中环的入口节点 {
public static class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
ListNode node1 = new ListNode(1);
ListNode node2 = new ListNode(2);
ListNode node3 = new ListNode(3);
ListNode node4 = new ListNode(4);
ListNode node5 = new ListNode(5);
node1.next=node2;
node2.next=node3;
node3.next=node4;
node4.next=node5;
node5.next=node3;
EntryNodeOfLoop(node1);
}
public static ListNode EntryNodeOfLoop(ListNode pHead)
{
if (pHead==null||pHead.next==null) {
return null;
}
ListNode slow = pHead;//速度为1的节点
ListNode fast = pHead;//速度为2的节点
ListNode enterence = null;//入口结点;
ListNode meet = null;
while (fast!=null) {
slow = slow.next;
fast = fast.next.next;
if (fast==slow) {
break;
}
}
if (fast==null) {
return null;
}
meet = slow;//得到碰撞点;
slow = pHead;//
fast = meet;//重新从起点和meet点走
while (slow!=fast) {
slow = slow.next;
fast = fast.next;
}
enterence = slow;//相遇的点就是入口
return enterence;
}
}
本文介绍了一种高效算法来确定链表中环的入口节点。通过使用快慢指针技术,首先找到环内的任意一点,再利用双指针同步前进的方式精确定位到环的入口节点。
822

被折叠的 条评论
为什么被折叠?



