1.链表长度为奇数时返回中点 偶数时返回前中点
public Node getMid1(Node head){
//单向链表要知道中点前3个起步
if(head ==null || head.next==null || head.next.next==null){
return head;
}
Node slow=head.next;
Node fast=head.next.next;
while (fast.next!=null && fast.next.next!=null){
fast=fast.next.next;
slow=slow.next;
}
return slow;
}
2.链表长度为奇数时返回中点 偶数时返回下中点
public Node getMid2(Node head){
//单向链表要知道中点后2个起步
if (head == null || head.next == null) {
return head;
}
Node slow = head.next;
Node fast = head.next;
while (fast.next != null && fast.next.next != null) {
slow = slow.next;
fast = fast.next.next;
}
return slow;
}
3.链表长度为奇数时返回中点前一个 偶数时返回上中点前一个
public Node getMid3(Node head){
if(head ==null || head.next==null || head.next.next==null){
return null;
}
Node slow = head;
Node fast = head.next.next;
while (fast.next != null && fast.next.next != null) {
slow = slow.next;
fast = fast.next.next;
}
return slow;
}
4.链表长度为奇数时返回中点前一个 偶数时返回下中点前一个
public Node getMid4(Node head){
if (head == null || head.next == null) {
return null;
}
if (head.next.next == null) {
return head;
}
Node slow = head;
Node fast = head.next;
while (fast.next != null && fast.next.next != null) {
slow = slow.next;
fast = fast.next.next;
}
return slow;
}
解题思路: 快指针的步长是慢指针的两倍,当快指针停时慢指针就定在你所需中点的前后(fast指针不能移动两部时停止) 所以第一步是要确定慢指针的位置(通过判空就可以确定慢指针位置),再根据需求确定快指针的位置(不是在下个位置,就是在下下个位置)