首页 > 其他分享 >LeetCode -- 19. 删除链表的倒数第 N 个结点

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

时间:2023-08-15 21:59:23浏览次数:42  
标签:ListNode cur val -- next 链表 int 倒数第 hd

 

一般的删除问题,可以直接删除(找符合条件的,找到了直接删掉),延迟删除(打标记,找完了再删除),栈,双指针

 

在链表中删除一个节点,要找到其前面一个节点cur, 然后 cur -> next = cur -> next -> next即可

 

方法一:直接删除

  我们先算出链表长度len,要删除倒第n个节点就是删除第len - n个节点。

/**
 * 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) {
        auto t = head;
        int len = 0;
        while(t) {
            len ++ ;
            t = t -> next;
        }

        auto hd = new ListNode(0, head), cur = hd;
        for(int i = 0; i < len - n; i ++ ) {
            cur = cur -> next;
        }
        cur -> next = cur -> next -> next;
        auto res = hd -> next;

        delete hd;
        return res;
    }
};

 

方法二:栈

  将所有节点入栈,然后出栈n个节点,栈顶元素即为要删除元素的前一个元素

/**
 * 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) {
        auto hd = new ListNode(0, head), cur = hd;
        stack<ListNode*> stk;
        while(cur) {
            stk.push(cur);
            cur = cur -> next;
        }
        for(int i = 0; i < n; i ++ ) stk.pop();
        auto pre = stk.top();
        pre -> next = pre -> next -> next;

        auto res = hd -> next;
        delete hd;

        return res;
    }
};

 

方法三:双指针

  这里采用快慢指针,让快指针比满指针快n个长度;当快指针指向末尾元素时,满指针指向倒数第n个节点的前一个节点。

/**
 * 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) {
        auto hd = new ListNode(0, head), cur = hd;
        auto lt = hd, rt = head;

        for(int i = 0; i < n; i ++ ) rt = rt -> next;
        while(rt) {
            rt = rt -> next;
            lt = lt -> next;
        }

        lt -> next = lt -> next -> next;
        auto res = hd -> next;

        return res;
    }
};

 

标签:ListNode,cur,val,--,next,链表,int,倒数第,hd
From: https://www.cnblogs.com/zk6696/p/17632547.html

相关文章

  • Penguin(南极原住民)的由来
    初一的一节晚自习,很热,我正在埋头做着作业。突然,一只手从后面拍了拍我的肩膀。而我又正好坐在后门旁边,我正心想是谁,回头一看,竟然是年级组长。这是,她冷不防地说了一句:“你是南极来的吧,不热吗?”声音不大,但在安静的教室中显得格外清晰。我只好尴尬地回了一句我不热。这时,我才发......
  • linux的基本命令操作
    mkdir-命令mkdir用于创建新的目录语法mkdir[-p]路径-p可选参数,表示自动创建不存在的父目录touch-cat-more-命令touch路径用于创建文件cat路径直接将内容全部显示出来more路径支持翻页(通过空格翻页,通过q退出查看)cp-mv-rm-命令cp命令可以用于复制文......
  • Welcome!!!
    欢迎来到Penguin_Chen的博客园个人简介男初三坐标:湖南长沙就读于长沙市一中金山桥喜欢看特摄和追番南极原住民的由来......
  • JavaSE--数字类
    一、数字格式化1、数字格式  #代表任意数字   ,代表千分位   .代表小数点  0代表不够时补0  例如#,###.0000表示加一个千分位,四位小数,不够补零2、数字格式化//表示加入千分位,保留两位小数DecimalFormatdf=newDecimalFormat("###,###.##");//Stri......
  • 【杂题乱写】USACO 2022 DEC
    BronzeT1CowCollege暴力扫一遍,更新最大值。提交记录:Submission-LuoguT2FeedingtheCows贪心放,维护一个能分别被\(\texttt{G}\)和\(\texttt{H}\)覆盖到的最远位置,如果当前位置\(i\)覆盖不到就在\(i+k\)放一个新的。由于\(i\)各不相同,这样放置除了可能在\(n\)......
  • JavaSE--枚举enum
    一、枚举类型1、什么使用使用枚举  在开发中,有可能遇到一个方法的执行结果可能包括三种情况,四种情况,五种情况不等,  但是每一个都是可以数清楚的,一枚一枚都是可以列举出来的。2、枚举的定义enum枚举类型名{枚举值1,枚举值2,枚举值3......}3、  枚举是一种引用......
  • JavaSE--Random类
    java.util.RandompublicclassRandomTest01{publicstaticvoidmain(String[]args){//创建随机数对象Randomrandom=newRandom();//随机产生一个int类型取值范围内的数字。intnum1=random.nextInt();System.out......
  • 学习go语言编程之网络编程
    Socket编程Golang语言标准库对Socket编程进行了抽象,无论使用什么协议建立什么形式的连接,都只需要调用net.Dial()即可。Dial()函数Dial()函数的原型如下:funcDial(network,addressstring)(Conn,error)参数含义如下:network:网络协议名字,如:tcp,udp等Dial()函数支持的网络......
  • ABC314 E和CF892 Div2D-E
    ABC314EE-Roulettes(atcoder.jp)大致意思是给你n个轮盘,第i个轮盘等概率的p[i]个点数,玩一次c[i]价钱,问要达到m点的最小期望花费是多少,每次可以任意选一个。乍一看很像背包,偏了方向,所以当时没有做出来。也考虑过其它的DP,关键是0怎么处理没搞明白所以赛后看他人的代码和题解......
  • 学习go语言编程之工程管理
    Go命令行工具安装了Go语言的安装包后,就直接自带Go命令行工具。#查看当前安装的Golang版本goversion#查看go命令行工具的帮助信息gohelpGo命令行工具可以完成如下工作:代码格式化代码质量分析和修复单元测试与性能测试工程构建代码文档的提取和展示依赖包管理执......