问题描述:
寻找循环链表的头结点。
思路分析:
利用快慢指针相遇来判断是否存在环路,同时将first和慢指针进行步进相遇,相遇点即为循环链表的头节点。
代码见下:
结点类定义
package List;
class Node{
int data;
Node next;
public Node(int data) {
this.data = data;
}
}
实现类定义:
package List;
public class Lbqdt {
//寻找环形链表起点(快慢指针)
public static Node lbstart(Node first)
{
Node s=first;//慢指针 步进一
Node f=first;//快指针 步进二
while (f==null||f.next==null)
{
s=s.next;
f=f.next.next;
if (s==f)//若两者相遇,则直接退出
break;
}
if (f==null||f.next==null)//判断是何种条件退出的
return null;
Node p1=first;
while (p1!=s)//最后是s和p1指针相遇来返回结果
{
p1=p1.next;
s=s.next;
}
return s;
}
public static void main(String[] args) {
Node first=new Node(1);
first.next=new Node(2);
first.next.next=new Node(3);
first.next.next.next=new Node(4);
first.next.next.next.next=first;
Node res= lbstart(first);
System.out.println(res.data);
}
}
运行结果见下: