问题描述
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
类似的题有Leetcode876 链表的中间节点
剑指offer27 回文链表
大致思路就是快指针先移动n次 ,快慢指针再以相同的速度移动 ,当快指针为空时,慢指针的位置就是倒数第n个结点
这道题有一个坑就是头结点该如何删除,解决方法是构造一个头结点,将入参的头结点作为该结点的next结点
要删除倒数第n个节点,需要找到的是倒数第n+1个节点,因此fast指针需要先移动n+1次
假设要删除倒数第二个节点
快指针移动三次
fast和slow同步向后移动,直到fast指向null,需要移动两次
删除slow的下一个节点即可
代码
class Solution {public ListNode removeNthFromEnd(ListNode head, int n) {ListNode start = new ListNode();start.next = head;ListNode fast = start;ListNode slow = start;for (int i = 0; i <=n; i ++) {fast = fast.next;}while (fast != null) {fast = fast.next;slow = slow.next;}slow.next = slow.next.next;return start.next;}}
运行结果

