19-删除链表的倒数第N个结点

题目

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

进阶:你能尝试使用一趟扫描实现吗?

示例 1:

输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]

示例 2:

输入:head = [1], n = 1
输出:[]

示例 3:

输入:head = [1,2], n = 1
输出:[1]

思路

关键是要找到目标结点的前一个位置,

双指针,当快指针到末尾null时,慢指针要位于目标结点的前一个结点

19-删除链表的倒数第N个结点

如图快指针先走N+1步即可

结束条件:fast为空

设置虚拟头节点dummy,返回dummy.next即为头节点

代码

class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {

        ListNode dummy = new ListNode(-1,head);
        ListNode fast = dummy;
        ListNode slow = dummy;
        //快指针先移动N+1步
        for(int i=1;i<=n+1;i++){
            fast = fast.next;
        }
        //快慢指针同时移动
        while(fast != null){
            fast = fast.next;
            slow = slow.next;
        }

        //移除目标指针
        slow.next = slow.next.next;

        //返回头节点
        return dummy.next;
    }
}
上一篇:876. 链表的中间结点


下一篇:2021-09-21142. 环形链表 II(快慢指针+数学)