代码随想录Day4 | 删除链表的倒数第N个结点 - Java

题目

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

示例

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

解释:

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

思路

我们通过添加虚拟头节点和双指针的思路来解决这道题。

首先,为什么要添加虚拟头节点呢?例如,如果我们要删除的是头节点,这时候的操作会与其余节点不同。然而,在头节点之前加一个虚拟节点,可以让原来的头节点变成普通节点,省去了我们多余的操作。

其次,我们该如何在这道题中运用双指针呢?

(1)我们先定义两个指针fastPointer和slowPointer,初始值都是虚拟节点。

(2)fastPointer首先走n + 1步 ,为什么是n+1呢,因为只有这样同时移动的时候slowPointer才能指向删除节点的上一个节点(方便做删除操作)。

(3)fastPointer和slowPointer同时移动,直到fastPointer指向null节点,删除slowPointer指向的下一个节点。

代码实现

class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode dummy = new ListNode(-1, head);

        ListNode slowPointer = dummy;
        ListNode fastPointer = dummy;

        for(int i = 0; i <= n; i++){
            fastPointer = fastPointer.next;
        }

        while(fastPointer != null){
            fastPointer = fastPointer.next;
            slowPointer = slowPointer.next;
        }

        slowPointer.next = slowPointer.next.next;
        return dummy.next;
    }
}

这里同样,由于虚拟节点是我们自己添加上去的,原题并不需要,因此最后从虚拟节点的下一个节点开始返回。

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值