题目:
思路:
由于链表不支持随机访问,因此常见的找出链表中间节点的方法是使用快慢指针:即使用两个指针 fast 和 slow 对链表进行遍历,其中快指针 fast 每次遍历两个元素,慢指针 slow 每次遍历一个元素。这样在快指针遍历完链表时,慢指针就恰好在链表的中间位置。
在本题中,还需要删除链表的中间节点,因此除了慢指针 slow 外,再使用一个指针 pre 时刻指向 slow 的前一个节点。这样就可以在遍历结束后,通过 pre 将 slow 删除了。
具体代码:
class Solution {
public ListNode deleteMiddle(ListNode head) {
if (head.next == null){
return null;
}
ListNode fast = head; //快指针遍历两步
ListNode slow = head; //慢指针遍历一步
ListNode pre = null; //pre指向慢指针的前一个
while (fast != null && fast.next != null){
fast = fast.next.next;
pre = slow;
slow = slow.next;
}
pre.next = pre.next.next;
return head;
}
}
总结:第一想法还是暴力解法,使用循环得到链表长度。再利用循环来删除中间节点。solution的快慢指针解法更好,还需要好好学习啊!