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

题目来源:

leetcode题目,网址:19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode)

解题思路:

使用双指针找到倒数第 N+1 个节点后删除链表的第 N 个节点即可。注意当 N 为链表长度时,倒数第 N+1 个节点不存在,head->next 即为所求。

解题代码:

复制代码
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode* lastNPlusOne=head;
        ListNode* lastOne=head;
        for(int i=0;i<n;i++){
            lastOne=lastOne->next;
        }
        if(lastOne==nullptr){
            return head->next;
        }
        while(lastOne->next!=nullptr){
            lastNPlusOne=lastNPlusOne->next;
            lastOne=lastOne->next;
        }
        lastNPlusOne->next=lastNPlusOne->next->next;
        return head;        
    }
};

总结:

官方题解新增了哑节点作为头节点以避免删除首个元素时的特殊判断。官方题解给出了三种解法。第一种是计算链表长度。两次遍历,第一次获得链表长度,第二次删除指定节点。第二种是栈,将所有元素入栈后,删去出栈时位于倒数第 N 个的节点。第三种是双指针。


相关推荐
Nil20811 小时前
leetcode 54螺旋矩阵
算法·leetcode·矩阵
依然鸣12 小时前
PTA团体程序设计天梯赛L1真题讲解L1-077-080
开发语言·c++·算法·深度优先·pat考试·图论
库玛西13 小时前
现代 C++ 智能指针全景指南:从 RAII 思想到工业级实践
c语言·开发语言·c++·笔记·面试
liulilittle14 小时前
无锁并发容器的设计与实现原理
开发语言·c++·set·map·并发·无锁·lock-free
qeen8714 小时前
【数据结构】自平衡二叉搜索树各种旋转算法原理解析及AVL树的C++实现
数据结构·c++·算法
Augustzero15 小时前
为什么线程不能说睡就睡?看懂等待与唤醒机制
c++·后端
程序员与背包客_CoderZ15 小时前
Linux D-Bus通信协议详解:从入门到C/C++编码实战
linux·服务器·c语言·c++·嵌入式硬件·嵌入式软件·dbus
冻柠檬飞冰走茶15 小时前
PTA基础编程题目集 7-35有理数均值(C++语言实现)
开发语言·数据结构·c++·算法·均值算法
wangchen_015 小时前
C++正则表达式
开发语言·c++·正则表达式
evans在进步16 小时前
LeetCode 394:字符串解码——Java 单栈模拟与嵌套解析详解
java·python·leetcode