当前位置: 首页 > news >正文

LeetCode[19] 删除链表的倒数第 N 个结点

如何删除?

  1. 找到倒数第n个节点的 前置(倒数n+1)节点后置(倒数n-1)节点
  2. 让目标节点的前置节点 指向 目标节点的后置节点
  3. 但是头节点没有前置节点怎么办?加一个空节点指向head就可以了

暴力遍历

  1. 为什么使用hair?因为被删除的可能是head节点呀
  2. 获取链表长度length
  3. 找到目标节点的前置节点,即第length-n个节点
  4. 前置节点指向后置节点
/**
 * 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* hair = new ListNode(-1,head);
        ListNode* tmp = head;
        // 获取链表长度
        int length = 0;
        while(tmp)
        {
            length++;
            tmp = tmp->next;
        }
        // 找到第length-n个节点
        tmp = hair;
        for(int i=0;i<length-n;i++)
        {
            tmp = tmp->next;
        }
        tmp->next = tmp->next->next;
        return hair->next;
    }
};

  1. 入栈,从空节点开始(不然删除头节点,出栈时找不到头节点的前置节点)
  2. 出栈n+1个节点,最后一个出栈的就是目标节点的前置节点
/**
 * 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* hair = new ListNode(-1,head);
        ListNode* tmp = hair;
        stack<ListNode*> mystack;
        while(tmp)// 入栈
        {
            mystack.push(tmp);
            tmp = tmp->next;
        }
        for(int i=0;i<=n;i++) // 出栈
        {
            tmp = mystack.top();
            mystack.pop();
        }
        tmp->next = tmp->next->next;
        return hair->next;
    }
};

双指针

  1. 建立一个空节点,指向头节点,可会快速返回头节点
  2. 指针1赋值为头节点,指针2赋值为hair节点 (为了能够停在前置节点)
  3. 指针1先走n步
  4. 指针1和指针2同时移动,直到指针1为空,即到链表尾部
  5. 此时指针2停留的位置就是要删除节点的前置节点
/**
 * 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* hair = new ListNode(-1,head); // 空节点指向头节点
        ListNode* first = head; // 指针1
        ListNode* second = hair; // 指针2 
        for(int i=0;i<n;i++) // 指针1先行移动n次
        {
            first = first->next;
        }
        while(first) // 指针1和指针2同时移动
        {
            second = second->next;
            first = first->next;
        }
		// 第n个节点的前置节点指向第n个节点的后置节点
        second->next = second->next->next;

        return hair->next;
    }
};

相关文章:

  • 跨境电商IP安全生死线,住宅代理与浏览器指纹攻防实录
  • redis缓存更新策略
  • 【ArduPilot】Windows下使用Optitrack通过MAVProxy连接无人机实现定位与导航
  • 优先队列 priority_queue详解
  • 成都国际数字影像产业园如何打造文创运营新模式​?
  • 【论文阅读】MMedPO: 用临床感知多模态偏好优化调整医学视觉语言模型
  • stride网络安全威胁 网络安全威胁是什么
  • HarmonyOs- UIAbility应用上下文
  • 产品战略之科学定价策略与模型(104页PPT)(文末有下载方式)
  • protobuf的学习
  • 算法刷题记录——LeetCode篇(6) [第501~600题](持续更新)
  • 聊聊langchain4j的Tools(Function Calling)
  • mybatis集合映射association与collection
  • 常用的遍历方法用途和运用
  • QT学习笔记1
  • 【在数轴上找最优位置,使移动距离最短】
  • 【区块链 + 商贸零售】商小萌小程序 | FISCO BCOS 应用案例
  • uniapp路由跳转导致页面堆积问题
  • 51单片机和STM32 入门分析
  • RSA后台解密报错:javax.crypto.BadPaddingException: Message is larger than modulus
  • 湖北宜化拟斥资超32亿加价回购“弃子”,布局上游煤炭业务
  • 上海市重大工程一季度开局良好,多项生态类项目按计划实施
  • 国防部:菲方应停止一切侵权挑衅危险举动,否则只会自食苦果
  • SIFF动画单元公布首批片单:《燃比娃》《凡尔赛玫瑰》等
  • 专访|韩国世宗研究所中国研究中心主任:李在明若上台将推行均衡外交
  • 牧原股份子公司与养殖户种猪买卖纠纷案一审胜诉