给定一个链表,不知道其长度,找出它的中间节点。
public Node findmiddle(List l){
//如果链表为空,直接返回空
if(l == null){
return null;
}
//如果链表只有头节点,直接返回空
if(l.head.next == null){
return null;
}
Node fast = l.head;
Node slow = l.head;
//从头节点开始向后遍历链表,一个指针每次走2步,一个指针每次走一步
//走的快的指针指向尾节点时,走的慢的指针刚好指向中间节点
while(fast != null && fast.next != null){
fast = fast.next.next;
slow = slow.next;
}
return slow;
}
有一个存在环的链表,找出环开始的节点
public Node findstartcycle(List l){
//如果链表为空,返回空
if(l == null){
return null;
}
Node fast = l.head;
Node slow = l.head;
//从头节点开始向后遍历链表,如果走的快的指针和走的慢的指针相遇,
//将快指针移动到头节点
while(fast != null && fast.next != null){
fast = fast.next.next;
slow = slow.next;
if(slow == fast){
fast = l.head;
bradk;
}
}
if(fast == null || fast.next == null){
return null;
}
//快指针和慢指针同时向后遍历链表,他们相遇时就是环的开始节点
while(slow != fast){
fast = fast.next;
slow = slow.next;
}
return slow;
}