力扣打卡: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;
}
}