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

19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode)

思路:

删除一个结点需要找到这个结点的上一个位置。由于可能会删除头结点,所以需要dummy结点。

使用两个指针 p1 和 p2,p2指向dummy。

先移动p1,使得p1和p2之间的距离为 n 。

然后再同时移动 p1 和 p2,这样当 p1 到达结尾处的时候,由于 p1 和 p2 之间的距离是 n ,此时 p2 的位置正好是倒数第 n 个结点的上一个位置,可以方便地进行删除操作。

总结:

使用两个指针,通过两个指针之间相距 n ,遍历一轮就找到了倒数第 n 个位置的上一个位置。

代码:

class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode dummy = new ListNode(0, head);
        ListNode p1 = head, p2 = dummy;
        // p1 先从头结点开始移动n步,使得 p1 和 p2 相隔 n 步
        while(n > 0 && p1 != null) {
            n--;
            p1 = p1.next;
        }
        // p1 和 p2 同时走, p1 走到结尾的时候,p2 就在倒数第n个位置的前一个结点
        while(p1 != null) {
            p1 = p1.next;
            p2 = p2.next;
        }
        // 删除倒数第n个结点
        p2.next = p2.next.next;
        // 返回删除后的头结点
        return dummy.next;
    }
}

参考:

19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode)题解

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值