876. 链表的中间结点_算法

使用快慢指针解法,起初快慢指针都指向head,慢指针每次循环走一步,快指针每次循环走两步,当块指针走完整个链表时,慢支针刚好走到链表的中间位置。

/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode middleNode(ListNode head) {
if (head.next == null) return head;
// int len = 0; //朴素解法
// ListNode temp = head;
// while(temp != null){
// len++;
// temp = temp.next;
// }
// int num = len/2;
// while(num-- != 0){
// head = head.next;
// }
// return head;

//快慢指针
ListNode p = head, q = head, pre = null;
while (q != null && q.next != null){
pre = p;
p = p.next;
q = q.next.next;
}
return p;
}
}

​快慢指针的相关应用及详细解析点此进入​