- 前言
在链表相关算法中,经常会遇到寻找链表中点,根据中点分割链表之类的算法;这边记录下寻找链表中点的方法,以及各个指针最终的指向,以便下次再遇到类似的问题时可以直接秒 - 实现
// 常规,三指针找到链表中点,pre为中点前一个(常用于分割),slow为中点及其右边
/*
注:
链表长度为奇数的话,slow指向正中间;
链表长度为偶数的话,slow指向中间两个数的右边;
*/
ListNode slow = head, fast = head, prev = null;
while (fast != null && fast.next != null) {
prev = slow;
slow = slow.next;
fast = fast.next.next;
}
// 中点右边 slow
// 中点左边 head
prev.next = null;
说明:三指针(添加一个指针指向slow的上一个),快速寻找到链表的中点以及进行分割。且之前无需使用if判断
- 实现二
// 需要先判空
if (head == null || head.next == null) {
return head;
}
// 双指针找到链表中点,slow为中点前一个(常用于分割),slow.next为中点及其右边
ListNode slow = head, fast = head.next.next;
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
}
// 中点右边 slow.next;;fast
fast = slow.next;
// 中点左边 head
slow.next = null;
说明:相比上面的三指针,这里让fast先走一步了,然后slow的指向就类似于上面的prev。只不过最开始需要进行判空。