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

leetcode之hot100---19删除链表的第N个节点(C++)

思路一:获取链表长度

首先获取链表的长度,然后根据链表长度与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) {
        ListNode* p = head;
        int count = 0;
        int len = 0;
        //遍历链表获取其长度
        while(p){
            len++;
            p = p->next;
        }
        
        //创建一个值为0后继为头节点的哨兵节点
        ListNode* sentry = new ListNode(0, head);
        
        //当要删除的节点为头节点且表中只有一个头节点时,
        //如果从头节点开始寻找要删除节点的位置会导致指针找不到位置
        //也就是在执行 p->next = p->next->next代码时会导致错误
        //因此,为了避免出现上述情况,选择从哨兵位置开始遍历
        p = sentry;
        while(count != len - n){
            p = p->next;
            count++;
        }
        p->next = p->next->next;
        ListNode* ans = sentry->next;
        delete(sentry);
        return ans;
    }
};
  • 时间复杂度:O(N)
  • 空间复杂度:O(1)

思路二:双指针

 先利用first指针找到第n个位置的节点,然后first指针和second指针同时移动,当first指针遍历到表尾,此时second指针刚好指向倒数第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) {
        //创建一个值为0后继为头节点的哨兵节点
        ListNode* sentry = new ListNode(0, head);
        ListNode* first = head;
        ListNode* second = sentry;
        int cnt = 0;
        //利用first找到第n个节点
        while(cnt < n){
            first = first->next;
            cnt++;
        }
        //同时更新first和second位置
        //由于first超second n个位置
        //当first遍历到链表的表尾时,second就恰好在倒数第n个节点
        while(first){
            first = first->next;
            second = second->next;
        }
        //删除倒数第n个节点
        second->next = second->next->next;
        ListNode* ans = sentry->next;
        delete sentry;
        return ans;
    }
};
  • 时间复杂度:O(N)
  • 空间复杂度:O(1)

http://www.kler.cn/a/451795.html

相关文章:

  • flask基础
  • Unity3d 基于UGUI和VideoPlayer 实现一个多功能视频播放器功能(含源码)
  • 注意力机制详解
  • Redis篇--常见问题篇6--缓存一致性1(Mysql和Redis缓存一致,更新数据库删除缓存策略)
  • GitCode 光引计划投稿|MilvusPlus:开启向量数据库新篇章
  • Docker 技术系列之安装多版本Mysql5.6和Mysql5.7
  • GitLab 将停止为中国区用户提供服务,60天迁移期如何应对? | LeetTalk Daily
  • 【NLP高频面题 - 高效微调篇】什么是提示微调?
  • 全国硕士研究生入学考试(考研)备考要点之备考原则
  • GMV 含义
  • 【R语言遥感技术】“R+遥感”的水环境综合评价方法
  • 接口请求中调试可以看到Origin,其具体的作用
  • 【文档搜索引擎】缓冲区优化和索引模块小结
  • 框架专题:设计模式
  • mvn install:install-file jar 打入本地仓库
  • 虚拟机桥接模式
  • Spark和Hive的联系
  • 【视觉惯性SLAM:SLAM中常用的数学基础知识】
  • BOM清单在制造企业运营中的全方位作用解析
  • 高并发处理 --- Caffeine内存缓存库
  • 【每日学点鸿蒙知识】私仓搭建、resources创建文件夹、hvigor如何动态设置版本、SM3摘要算法、SP存储报错等
  • 【MySQL】7.0 入门学习(七)——MySQL基本指令:帮助、清除输入、查询等
  • mysql的存储碎片
  • PHP后执行php.exe -v命令报错并给出解决方案
  • AI科学家用大模型自动探索人工生命,近屿智能深耕AI大模型
  • 纯Dart Flutter库适配HarmonyOS