LeetCode链表经典题目(二)

news2024/11/16 13:37:38

1. LeetCode203. 移除链表元素

2. LeetCode707.设计链表

3. LeetCode206. 反转链表

4. LeetCode24. 两两交换链表中的节点​

5. LeetCode19. 删除链表的倒数第 N 个结点

6. LeetCode面试题 02.07. 链表相交

7. LeetCode142. 环形链表 II​


1. LeetCode203. 移除链表元素

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        ListNode*resHead=new ListNode(-1);//虚拟头节点,防止丢失
        resHead->next=head;
        ListNode*tmp=head;//tmp去遍历所有节点
        ListNode*pre=resHead;//tmp的前驱节点
        while(tmp!=NULL){
            if(tmp->val==val){
                pre->next=tmp->next;
            }else{//pre只有当tmp的值不等于val时,才移动。因为如果当前节点要被删除,就无法成为前驱节点
                pre=tmp;
            }
            //tmp无论如何都要往下一个节点移动
            tmp=tmp->next;
        }
        return resHead->next;
    }
};

2. LeetCode707.设计链表

//注意及时return,避免函数后面的操作干扰特殊情况的结果
class MyLinkedList {
public:
    ListNode*head;
    MyLinkedList() {
        //把链表头初始化为空指针
        head=NULL;
    }
    
    int get(int index) {
        //如果链表头为空指针,直接返回-1
        if(head==NULL)return -1;
        //创建头指针副本
        ListNode*tmp=head;
        while(index--){//用后置减的原因:head的索引为0
            tmp=tmp->next;
            //如果index还没到0,但是tmp已经是空指针了,说明index越界了,返回-1
            if(tmp==NULL)return -1;
        }
        //tmp一定不是空指针,直接返回值即可
        return tmp->val;
    }
    
    void addAtHead(int val) {
        //就算链表头是空指针也无妨
        ListNode*newNode=new ListNode(val);
        newNode->next=head;
        head=newNode;
    }
    
    void addAtTail(int val) {
        //如果链表头是空指针,无法调用head->next,所以先判断一下
        ListNode*newNode=new ListNode(val);
        if(head==NULL){
            head=newNode;
            return;
        }
        ListNode*tmp=head;
        while(tmp->next!=NULL){
            tmp=tmp->next;
        }
        tmp->next=newNode;
    }
    
    void addAtIndex(int index, int val) {
        if(index<=0){//index小于0,将其加到链表头
            addAtHead(val);
            return;
        }

        ListNode*tmp=head;
        ListNode*pre=NULL;//前驱节点
        while(index>0&&tmp!=NULL){
            pre=tmp;
            tmp=tmp->next;
            index--;
        }
        if(tmp==NULL&&index>0)return;//索引大于链表长度
        if(tmp==NULL&&index==0){//索引等于链表长度,添加到链表尾,注意及时返回
            addAtTail(val);
            return;
        }

        //tmp!=NULL
        ListNode*newNode=new ListNode(val);
        pre->next=newNode;
        newNode->next=tmp;
    }
    
    void deleteAtIndex(int index) {
        //链表凹凸为空指针,没有可以删除的节点
        if(head==NULL)return;
        //删除索引若为0,意味着删除链表头,直接让链表头后移即可,注意及时return
        if(index==0){
            head=head->next;
            return;
        }

        ListNode*tmp=head;
        ListNode*pre=NULL;//前驱节点
        while(index--){
            pre=tmp;
            tmp=tmp->next;
            if(tmp==NULL)return;
        }
        pre->next=tmp->next;
    }
};

3. LeetCode206. 反转链表

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        if(head==NULL||head->next==NULL){
            return head;
        }
        ListNode*reverseHead=new ListNode(-1);//前驱节点,防止丢失链表
        ListNode*cur=head;
        ListNode*next=cur->next;
        while(cur!=NULL){
            next=cur->next;//先记录好原链表的next节点
            cur->next=reverseHead->next;
            reverseHead->next=cur;
            cur=next;
        }
        return reverseHead->next;
    }
};

4. LeetCode24. 两两交换链表中的节点

class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        if(head==NULL||head->next==NULL)return head;
        ListNode*swapHead=new ListNode(-1);//创建前驱节点,防止链表丢失
        ListNode*cur=head;//当前需转换对的第一个节点
        ListNode*next=cur->next->next;//下一对的第一个节点
        ListNode*pre=swapHead;
        while(cur!=NULL&&cur->next!=NULL){//如果最后剩下节点数小于等于1,就不需要再做任何处理了
            next=cur->next->next;//因为要改变cur->next->next,所以先备份
            //由于前一对总是直接连接到后一对的第二个节点,所以会遗漏节点。因此创建一个前驱节点来前后连接
            pre->next=cur->next;
            //前驱节点即为每一对做完交换的后一个节点
            pre=cur;
            cur->next->next=cur;
            cur->next=next;
            cur=next;
        }
        return swapHead->next;
    }
};

5. LeetCode19. 删除链表的倒数第 N 个结点

双指针:快慢指针法
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode*dummyHead=new ListNode(0);
        dummyHead->next=head;
        ListNode*slow=dummyHead;
        ListNode*fast=dummyHead;

        //让fast先走n+1步,然后再让fast和slow一起移动,结束时,slow指向要删除节点的前一个
        while(n--&&fast!=NULL){
            fast=fast->next;
        }
        fast=fast->next;

        while(fast!=NULL){
            slow=slow->next;
            fast=fast->next;
        }

        slow->next=slow->next->next;
        return dummyHead->next;
    }
};

6. LeetCode面试题 02.07. 链表相交

利用A、B链表的长度差,相当于让长的链表先走长度差步
class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        ListNode*A=headA;
        ListNode*B=headB;
        while(A!=NULL||B!=NULL){//A和B同时为空说明无交点
            if(A==B)return A;
            A=A==NULL?headB:A->next;
            B=B==NULL?headA:B->next;
        }
        return NULL;
    }
};

7. LeetCode142. 环形链表 II

双指针:快慢指针法
class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        ListNode*fast=head;
        ListNode*slow=head;
        while(fast!=NULL&&fast->next!=NULL){
            fast=fast->next->next;
            slow=slow->next;
            if(fast==slow){
                ListNode*index1=fast;
                ListNode*index2=head;
                while(index1!=index2){
                    index1=index1->next;
                    index2=index2->next;
                }
                return index1;
            }
        }
        return NULL;
    }
};

糊涂版本代码:
class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        //定义快慢指针
        ListNode*slow=head;
        ListNode*fast=head;
        //由于一开始对快慢指针的定义,导致函数根本无法进入该循环
        while(fast!=slow){
            fast=fast->next->next;
            slow=slow->next;
        }
        ListNode*index1=head;
        ListNode*index2=slow;
        while(index1!=index2){
            index1=index1->next;
            index2=index2->next;
        }
        return index2;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/129194.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于同豪的道路桥梁设计方案如何实现数字化交付(web发布)

0序&#xff1a; 当下有部分设计人员除了使用Revit、Microstation之外也使用过程的同豪软件进行道路桥梁的BIM建模。如何对同豪的BIM模型进行数字化交付呢&#xff1f; 1数据导出为FBX 具体导出过程可以参考&#xff1a; 数据的导出只要按步骤导出就行&#xff0c;非常简单…

2023最让人期待的日历!每个IT技术人必备

一转眼&#xff0c;2022年已经要接近尾声了..... 这一年的你过的怎么样呢&#xff1f;相比上一年的自己有什么变化呢&#xff1f; 凡是过往皆为序章&#xff0c;所有将来皆为可盼&#xff01;在2023年即将到来之际给大家推荐一本非常适合IT技术人的日历&#x1f449;「小滴日历…

python—you-get下载工具、wget下载工具

目录 wget you-get wget wget工具下载&#xff1a;GNU Wget 1.21.3 for Windows wget工具见&#xff1a;python-外部程序的调用os库、subprocess 模块_觅远的博客-CSDN博客_python外部库调用调出 you-get you-get是一款实用的网站视频下载工具。可以很轻松的下载到网络上…

极限学习机ELM回归预测(MATLAB代码实现)

&#x1f352;&#x1f352;&#x1f352;欢迎关注&#x1f308;&#x1f308;&#x1f308; &#x1f4dd;个人主页&#xff1a;我爱Matlab &#x1f44d;点赞➕评论➕收藏 养成习惯&#xff08;一键三连&#xff09;&#x1f33b;&#x1f33b;&#x1f33b; &#x1f34c;希…

【数据结构与算法】第十七篇:图论万字解析(进阶篇)

&#x1f440;作者简介&#xff1a;大家好&#xff0c;我是 快到碗里来~ &#x1f6a9;&#x1f6a9; 个人主页&#xff1a;快到碗里来~ 支持我&#xff1a;点赞关注~不迷路&#x1f9e1;&#x1f9e1;&#x1f9e1; ✔系列专栏&#xff1a;数据结构与算法⚡⚡⚡ (❁◡❁)励志格…

代码随想录算法训练营第十一天(栈与队列)| 20. 有效的括号,1047. 删除字符串中的所有相邻重复项,150. 逆波兰表达式求值

代码随想录算法训练营第十一天&#xff08;栈与队列&#xff09;| 20. 有效的括号&#xff0c;1047. 删除字符串中的所有相邻重复项&#xff0c;150. 逆波兰表达式求值 20. 有效的括号 讲完了栈实现队列&#xff0c;队列实现栈&#xff0c;接下来就是栈的经典应用了。 大家先…

激发原创力量,逐梦数智未来 | 麒麟信安闪耀openEuler Summit 2022

[中国&#xff0c;北京&#xff0c;2022年12月29日]由欧拉开源社区发起并联合华为、麒麟信安、麒麟软件、统信软件等伙伴&#xff0c;共同举办的openEuler Summit 2022于线上举行。 会上&#xff0c;开放原子开源基金会宣布openEuler项目群成立&#xff1b;同时&#xff0c;新…

CVPR 2021|Deep-SfM-Revisited:DeepLearn+经典SfM流程

&#x1f3c6;前言&#xff1a;文章回顾了深度学习在SfM中的应用&#xff0c;并提出了一种新的深度两视图SfM框架。该框架结合了深度学习和经典SfM几何算法的优点。在各个数据集上取得较好的结果。 文章目录解决的问题基本流程实施细节光流估计相机位姿估计尺度不变的深度估计损…

关于安科瑞电力监控系统在电力工程中的应用与对策

摘要&#xff1a;随着经济的发展&#xff0c;能源消耗速度正不断加快&#xff0c;因此我国提出了绿色可持续发展战略&#xff0c;要求在发展建设中以节能为主&#xff0c;不断减少资源能耗&#xff0c;而电能便是首要控制内容。如今我国为电能使用&#xff0c;对计量表进行了优…

《PyTorch深度学习实践》完结合集-P4反向传播作业

二次函数的反向传播 代码&#xff1a; import torch x_data [1.0, 2.0, 3.0] y_data [2.0, 4.0, 6.0] w1 torch.Tensor([1.0]) w1.requires_grad True #定义要进行反向传播 w2 torch.Tensor([1.0]) w2.requires_grad True b torch.Tensor([1.0]) b.requires_grad T…

PHP结课报告-简单的点菜系统(完整版,附源码与数据库)

1 系统背景及意义 1.1系统开发背景介绍 餐饮业在我国有着悠久的发展历史&#xff0c;是与人民生活密切相关的 行业之一&#xff0c;同时也是我国经济增长的新亮点&#xff0c;在 2010 年全国餐饮零 售总额高达 15913 亿元&#xff0c;实际增长约 14.3。在信息系统相对普及的 今…

项目经理通过甘特图编制项目计划的方法

项目有个特征叫 渐进明晰 &#xff0c;指一个项目不可能一开始就能想到最后交付成果的全部细节&#xff0c;项目最终的交付成果到底长啥样是随着项目的推进慢慢变得清晰的&#xff0c;而这个变化的过程不仅需要项目经理的经验与能力&#xff0c;还需要借助项目管理工具的帮助。…

一文讲清「敏捷路线图」,从此不再掉入瀑布陷阱

尽管许多组织和团队声称自己非常敏捷&#xff0c;但他们仍在使用瀑布的方式规划产品。为什么会这样&#xff1f;我们该如何改变这种「错误敏捷」&#xff1f; 原则上&#xff0c;践行敏捷开发很简单&#xff1a;构建一个增量&#xff1b;测试这个增量&#xff1b;了解需要改变…

webdriver的尝试:四 【移动端的使用appium-定位与获取代码】

文章目录界面的简单认识和使用参考我们前面使用webdriver可以实现&#xff1a;使用代码&#xff0c;自动化打开浏览器及指定页面&#xff0c;定位元素&#xff0c;获取内容或者模仿操作那么使用移动端&#xff0c;依然需要实现定位与操作 主要就是在appium inspector上进行操作…

开源全球公司贡献 49 名,涛思数据荣登 2022 中国开发者影响力年度榜单

12 月 28 日&#xff0c;CSDN 在北京举行 “2022 中国开发者影响力盛典暨 CSDN 企业生态汇”活动&#xff0c;同时正式发布 2022 中国开发者影响力年度榜单。本次公布的榜单主要包括年度开源贡献企业、年度开源影响力项目、年度开发者社区、年度数字化创新企业、年度优秀雇主企…

蓝桥杯Python练习题13-圆的面积

资源限制   内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述   给定圆的半径r&#xff0c;求圆的面积。 输入格式   输入包含一个整数r&#xff0c;表示圆的半径。 输出格式   输出…

自然语言处理复习

目录 第 3 章 深度学习基础 第 4 章 语言模型词向量 第 5 章 NLP中的注意力机制 第 6 章 NLP基础任务 第 7 章 预训练语言模型 第 3 章 深度学习基础 1. 人工神经网络 2. 激活函数 &#xff08;1&#xff09;激活函数的作用 为了增强网络的表达能力&#xff0c;需要引入…

在你的岗位中领导:为人力资源职员提供提升招聘管理能力

香港 (Xinwengao.com) — 每年外籍老师表示他们因为沟通问题停止考虑某间学校。这会发生有几个原因但大部分则是因为前线员工并没有感受到得到可以维持与候选人互动。 PD Academia 在此提供这个双语培训课程来帮助中国的学校提升招聘管理能力&#xff1a; 在你的岗位中领导&a…

数字藏品年终盘点:从长坡厚雪到无人问津,潮起潮落的2022

文/尹宁 出品/陀螺研究院 数字藏品&#xff0c;无疑是2022年我国区块链界最为瞩目的应用&#xff0c;在这一年中&#xff0c;数字藏品行业从高歌猛进到急速刹车、从企业扎堆到巨头退场&#xff0c;从需求高涨到被迫出清&#xff0c;经历了跌宕起伏、高潮迭起的发展历程。 上…

ARM64内存虚拟化分析(8)coalesed MMIO处理

从前面MMIO的处理可以看到&#xff0c;每次访问MMIO都会导致虚拟机退了到QEMU中。很多时候多个MMIO操作&#xff0c;这个时候可以先将前面的MMIO操作保存起来&#xff0c;等到最后一个MMIO的时候&#xff0c;再一起退出到QEMU中处理&#xff0c;这就是coalesced MMIO。目前只支…