1. 链表的中点
使用快慢指针寻找链表的中点有2种方式,分别是fast=head; fast=head.next;
1. fast = head;
public ListNode findMidNodeFromHead(ListNode head) {
ListNode slow = head;
ListNode fast = head;
while ((fast != null) && (fast.next != null)) {
slow = slow.next;
fast = fast.next.next;
}
return slow;
}
2. fast = head.next;
public ListNode findMidNodeFromHeadNext(ListNode head) {
ListNode slow = head;
ListNode fast = head.next;
while ((fast != null) && (fast.next != null)) {
slow = slow.next;
fast = fast.next.next;
}
return slow;
}
这2种方式寻找链表的结点主要区别是 当链表的长度为奇偶数时,找到链表中点的位置一个靠后,一个靠前。
当链表为奇数时 [1->2->3->4->5]
//odd number length
ListNode oddMidFromHead = findMidNodeFromHead(head2);
ListNode oddMidFromHeadNext = findMidNodeFromHeadNext(head2);
System.out.println("oddMidFromHead=" + oddMidFromHead + " oddMidFromHeadNext=" + oddMidFromHeadNext);
//output
oddMidFromHead=[3->4] oddMidFromHeadNext=[3->4]
当链表长度为奇数时,找到的中点2种方式是一样的。
当链表为偶数时 [1->2->3->4]
//even number length
ListNode evenMidFromHead = findMidNodeFromHead(head);
ListNode evenMidFromHeadNext = findMidNodeFromHeadNext(head);
System.out.println("evenMidFromHead=" + evenMidFromHead + " evenMidFromHeadNext=" + evenMidFromHeadNext);
//output
evenMidFromHead=[3->4] evenMidFromHeadNext=[2->3]
当链表的长度为偶数时,head找到的中点是靠后的,因为fast相对slow移动只快了1步,而head.next找到的中点是靠前的,因为fast相对slow移动快了2步。