如何判断一个单链表是否有环?有环的话返回进入环的第一个节点的值,无环的话返回-1。如果链表的长度为N,请做到时间复杂度O(N),额外空间复杂度O(1)。
给定一个单链表的头结点head(注意另一个参数adjust为加密后的数据调整参数,方便数据设置,与本题求解无关),请返回所求值。
思路:先用两个指针A和B,A跳一步,B跳两步,如果重逢了,就再将A重置到头结点,然后循环A和B同时跳一步,并判断A和B是否相等,如果相等,则表示是环的起始节点;
代码如下:
package lianbiao;
public class lianbiaopanhuan {
public static void main(String[] args) {
ListNode l1 =new ListNode(1);
ListNode l2 =new ListNode(2);
ListNode l3 =new ListNode(3);
ListNode l4 =new ListNode(4);
ListNode l5 =new ListNode(5);
l1.next = l2;
l2.next = l3;
l3.next = l5;
l4.next = l5;
l5.next = l3;
System.out.println(lianbiaopanhuan.chkLoop(l1, 5));
}
public static int chkLoop(ListNode head, int adjust) {
ListNode first = head;
ListNode second = head;
if(first == null || second == null)
return -1;
while(second != null){
first = first.next;//跳一步
second = second.next.next;//跳两步
if(first == second){
break;
}
}
first = head;
while(first != second){
first = first.next;
second = second.next;
}
System.out.println(first.val+"是链表头的值");
return first.val;
}
static class ListNode{
int val = 0;
ListNode next = null;
ListNode(int val){
this.val = val;
}
}
}