LeetCode - 删除链表的倒数第N个节点 - 一趟扫描 - 初级算法

还是 链表的问题有趣啊

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

示例:

给定一个链表: 1->2->3->4->5, 和 n = 2.

当删除了倒数第二个节点后,链表变为 1->2->3->5. 说明:

给定的 n 保证是有效的。

进阶:

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

一趟扫描实现 ?删除倒数第n个节点
能吗
答案是可以的
不过 需要使用两个指针 两个以相同的速度移动的指针
但是呢 一个指向现在 一个指向未来
比如 例子里给出的 删除倒数第 2 个
我们初始化两个指针
如果 一个指针 指向 i 的话 另一个指针就指向 i + 2
当 指向 i + 2 的那个指针 指向了 null
不就意味着 指向 i 的那个指针 指向的 是倒数 第 2 个吗
就好像 是 一个指针 指向的现在 另一个指针 指向了未来
所以 你可以在现在 的时刻 知道未来发生的事情
神奇啊

上 代码 看看

 /**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode* firstP = head;
        ListNode* nextP = head;
        int i;
        // 先循环 n 次 让 nextP 去到 n 天 的未来 看看情况
        for(i = 0;i < n;i ++){
            nextP = nextP -> next;
        }
        // 如果呢 n 天后 是 世界末日了 
        //那么 说明  这个链表 总共有 n 个 节点 
        //要删除 的 倒数第 n 个 节点 
        //不就是 第一个节点 那么接下来删除第一个就好了 
        //先看看 这个链表是否长度为1  
        //长度要是为 1 的话 删掉第一个 不就什么也没有了呀 直接 head = null 
        //否则 执行删除第一个节点
        if(nextP == NULL){
            if(head -> next == NULL)
                head = NULL;
            else{
                head -> val = head->next->val;
                head -> next = head -> next ->next;
            }
            return head;
        }
        // nextP  和 firstP 以相同的速度向未来进发
        while(nextP -> next != NULL){
            nextP = nextP -> next;
            firstP = firstP -> next;
        }
        // nextP 走到了 世界末日 firstP 执行删除操作
        firstP -> next = firstP -> next-> next;

        return head;
    }
};

总的来说 也是不难的啦
不过 要注意的是 一种特殊情况
链表 总共长 n 要删除 倒数 第 n 个
相当于 删除 第一个
但是呢 head 节点 就是指向的第一个
如何删除 自己呢 ?
就要用到上一个问题的思路了 详情可以看我上一篇文章哦

全部评论

相关推荐

2025-12-13 21:01
已编辑
百度_meg_前端开发(实习员工)
走到这一步,确实有些意外。先简单说说我的情况,我是双非本,大一那年对后端兴趣特别浓,学了快一年半。但不知为什么越往后学兴趣越淡——大概到分布式那块,比如nacos、卡夫卡这些,感觉越来越吃力。再加上看到师兄师姐在后端方向上的碰壁(现在是大go时代),在和师兄师姐商量后我在今年一月左右转前端了或许是因为有java的基础,对项目开发流程有些概念,前端三件套我过得比较快。之后学了Vue,动手做了自己的博客,这大概也是我转前端的一个重要原因吧,一直很想拥有一个属于自己的个人博客,能按自己的想法去设计、实现,并长期迭代完善,这种成就感真的很棒。之前拿过别人的开源项目来更改&nbsp;但是自己修改的就是一坨,那个时候缺少对前端代码的理解&nbsp;就算借助ai做出来的效果也是一坨就这样到了大二暑假,我觉得该找份实习,丰富一下简历了。我自认不是很有创造力的人,平时少有自发的项目灵感,所以更希望通过实习开阔眼界、提升能力。一开始投递和面试的过程挺煎熬的,或许是因为目标多是中小厂,很多hr已读不回,或是直接砍半薪资问我接不接受。面试时也常觉得像在走流程,问的都是八股文,有的面试官还会边看题边问,甚至有一次十分钟就结束了,好在最后钛动给了我机会。实习期间我学到了很多,虽然也常被拷打,还好ld会帮我收拾烂摊子。从钛动离职回校后,我半推半就地背八股、学新技术,无聊时就刷里扣、看看牛客和biss。原本以为双非bg很会被hr速度筛掉所以就尝试性的投了纷享销客和百度的日常实习,没想到最后两家都oc了,雷姆了家人们,双非鼠鼠居然圆了大厂梦yysy,这一路其实冒了不小的风险。毕竟学了那么久的后端,大学四年时间有限,突然转前端,意味着很多积累的知识可能用不上了。但我很庆幸当时有放下的勇气。无论过去做了什么选择,我都想感谢当时的自己,因为那份勇气,才走到了今天。同时也很感谢这一路师兄师姐的帮忙,师兄帮忙模拟面试,提供资料,师姐教我如何选择岗位,如何处理实习带来的问题马上就要北漂了,对未来是充满了期待也存在着恐惧,南方人头一次去这么远的地方,每天都能看到雪,可以跟实力强劲的同事合作,想想都很兴奋,但是也害怕自己不能胜任这份工作会被压力到爆,但是不管怎么样大家一起互勉吧,呆在舒适区只会停滞不前,压力才能带来成长
牛马人的牛马人生:勇敢追梦
2025年终总结
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务