876. 链表的中间结点

力扣打卡:876. 链表的中间结点

解题思路

暴力解法:通过遍历链表,得到长度,然后除2向上取整,得到了中间节点

快慢指针:使用两倍速和一倍速对路径的中间进行确定
因为速度查了一半,所以当一个已经走完全路程后,另外一个刚好走了一半

同理,如果要求1/3处的也可以通过快慢指针来做,通过相同的性质进行指向

代码

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode middleNode(ListNode head) {
        ListNode fast=head, slow=head;
        while(fast != null && fast.next != null){ // 确保不是空链表或者是单个节点的链表,如果是单个节点的链表直接返回
            fast = fast.next.next;   // 进行两倍速行走
            slow = slow.next;        // 进行一倍速行走
        }
        return slow;
    }
}
上一篇:面试题 02.02. Kth Node From End of List LCCI


下一篇:19-删除链表的倒数第N个结点