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

目录

题目叙述

 题解代码(双指针法)

提交结果


 

题目叙述

 题解代码(双指针法)

思路:这道题是双指针法的经典应用,如果要删除倒数第n个结点,让 fast(快指针)先移动n步,然后让 fast 和 slow 同时移动,直到 fast 指向链表尾,这样 slow 就指向了倒数第n个结点,再将其删掉即可。

一些细节的处理:

1.建议使用虚拟头结点,让 fast 和 slow 的初值指向虚拟头结点,这样更加方便操作

2.fast 先走n+1步(这里非常关键),这样在同时移动后,last 就指向了第 n-1 个结点(即目标删除结点的上一个结点),这样更加方便删除操作。

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
       ListNode* dummyHead = new ListNode(0); //设置虚拟头结点
       dummyHead->next = head;
       ListNode* slow = dummyHead; //双指针法:fast 和 slow 初值均为虚拟头结点
       ListNode* fast = dummyHead;
       while(n--)
       {
            fast = fast->next;
       }
       fast = fast->next; //这里是非常关键的一步,即fast指向第n个结点时,再向前走一步,指向第n+1个结点。
        while(fast != NULL)
        {
            slow = slow->next;
            fast = fast->next;
        } 
        slow->next = slow->next->next;
        return dummyHead->next;
    }
};

提交结果

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值