数据结构(2):LinkedList和链表[2]

news2024/9/20 5:39:07

我们在上一篇文章中着重讨论了单链表的实现。其中我们要注意单链表进行遍历时一步一步走的思想。那么这篇文章我们将继续讨论链表的更多内容,那就让我们开始吧。

1.经典单链表算法题

我们将通过几个经典的题对单链表进行进一步的认识。

(1)反转链表

206. 反转链表 - 力扣(LeetCode)

现在我们希望对链表进行反转。大致如下:

我们选择的方法,是遍历头插。举例子,我们现在用cur=head.next,即我们用cur引用2节点,我们把它进行头插,那么会变成下面这样。这里注意,我们原本的头节点在反转后,它的next为空,所以我们要先把头节点处理为空

那么我们发现,仅仅把头节点置为空它会找不到cur的下一个节点,我们需要再建立一个curNext引用来将他们连上,再将头节点变为“2”节点。

这个时候我们再把cur节点指向curNext,进行下一轮头插,直到所有节点都完成头插完成,因此我们可以想到这是一个循环,下面我们用代码实现一下:

 public Listnode reverseList(Listnode head) {//反转链表
        if(head==null||head.next==null){
            return head;
        }

        Listnode cur=head.next;
        head.next=null;
        while(cur!=null){
            Listnode curNext=cur.next;
            cur.next=head;
            head=cur;
            cur=curNext;
        }
        return head;
    }

大家可以体会一下。

(2)链表的中间节点

876. 链表的中间结点 - 力扣(LeetCode)

下面我们要寻找链表的中间节点,当链表节点数为偶数时,中间节点为中间第二个节点。我们的思想可以称之为“双指针”。我们定义两个节点fast和slow同时指向头节点,fast先走,一次走两步,slow在这之后一次走一步,当fast走完,slow正好在中间节点上

我们来实现一下:

public ListNode middleNode(ListNode head) {
         ListNode fast=head;
        ListNode slow=head;

       while(fast!=null&&fast.next!=null){
        fast=fast.next.next;
        slow=slow.next;
       }
        return slow;
    }

(3)返回倒数第k个节点

面试题 02.02. 返回倒数第 k 个节点 - 力扣(LeetCode)

下面我们要找出倒数第k个节点,同样,我们也可以使用“双指针”的思想,我们这次先让fast先走k-1步,再让slow与它同步走,此时当fast走到最后时,slow恰好是倒数第k个,这个代码就很好实现了:

public int kthToLast(ListNode head, int k) {
        ListNode fast=head;
        ListNode slow=head;

        for(int i=0;i<k-1;i++){
            fast=fast.next;
        }
        while(fast.next!=null){
            fast=fast.next;
            slow=slow.next;
        }
        return slow.val;
    }

(4)合并两个有序链表

21. 合并两个有序链表 - 力扣(LeetCode)

下面我们要把两个有序链表合并成一个,同时合并出来的新链表也要保证有序。两个链表的头节点都给我们了,分别是list1和list2,我们要定义一个新的头节点nHead用来组建新的链表,然后用list1和list2进行比较,谁小,谁就先跟在nHead后面,同时自己往后走一步。这样就能串起来,一个链表串完了,剩下的就都是另一个链表的了,直接都穿上就可以了。

代码也很好实现:

 public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
        ListNode nHead=new ListNode();
        ListNode tHead=nHead;
       

        while(list1!=null&list2!=null){
            if(list1.val<=list2.val){
                tHead.next=list1;
                tHead=tHead.next;
                list1=list1.next;
            }else{
                tHead.next=list2;
                tHead=tHead.next;
                list2=list2.next;
            }
        }
        if(list1==null){
            tHead.next=list2;
        }
        if(list2==null){
            tHead.next=list1;
        }
        return nHead.next;
    }

(5)找出两个链表的第一个公共节点

160. 相交链表 - 力扣(LeetCode)

两个不等长的链表,我们要找出他们第一个公共节点,我们可以这么做。我们只需要让长的那个链表先走出两个链表长度的差值,这时他们就在同一起点,他们“齐步走”,就可以相遇了,如果一直没相遇,就说明没有公共节点。

那么我们需要先求出差值,再进行后续的操作,我们可以这样实现:

  public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        int pl=0;
        int ps=0;

        ListNode Pl=headA;
        ListNode Ps=headB;
        ListNode cur=new ListNode();
        cur=headA;
        while(cur!=null){
            cur=cur.next;
            pl++;
        }
        cur=headB;
        while(cur!=null){
            cur=cur.next;
            ps++;
        }
        int len=pl-ps;
        if(len<0){
            len=-len;
             Pl=headB;
             Ps=headA;
        }
        for(int i=0;i<len;i++){
            Pl=Pl.next;
        }
        while(Pl!=Ps){
            Pl=Pl.next;
            Ps=Ps.next;
        }
        return Pl;
    }

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

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

相关文章

2024年上海初中生古诗文大会倒计时一个半月:做一做2024官方模拟题

2024年上海市初中生古诗文大会自由报名活动的初赛日期于11月3日开始&#xff0c;距离今天大概一个半月。 如何准备2024年初中生古诗文大会的自由报名初选呢&#xff1f;吃透&#xff08;记熟&#xff09;2024年初中生古诗文阅读专辑上的题目、知识点和往年真题及知识点。 有许…

Python数据分析-世界上最富有的1000人

一、研究背景 随着全球化的加速发展和技术的进步&#xff0c;财富分配问题日益成为全球关注的焦点。财富的不平等现象日益明显&#xff0c;少数极富有的个人掌握了全球大部分的财富资源。了解全球最富有个人的财富分布及其背后的行业和国家因素&#xff0c;对于分析全球经济趋…

Element-ui el-table 全局表格排序

实现效果如下&#xff1a; 一、当页数据排序 如果只想要当前页面排序&#xff0c;只会涉及到前端&#xff0c;只需在<el-table-column>标签上添加 :sortable"true"即可 二、自定义排序 如果想要全局排序&#xff0c;需要自定义排序函数&#xff0c;请求后台排…

Linux基础---10进程管理

一.查看和关闭进程 1.查看进程 基础指令: ps -efPID 进程编号&#xff0c;PPID 父进程编号&#xff0c; CMD命令名称 进阶指令–查看进程的树形结构&#xff1a; yum install psmisc -y #首先安装psmisc后可直接使用pstreepstree2.关闭进程 要想关闭某个或多个进程需要知道…

简洁明了!中缀表达式转为后缀表达式规则及代码

简单来说&#xff0c;就是弄两个栈&#xff0c;判断执行&#xff1a; 上代码&#xff1a; #include<iostream> #include<stack> #include<cstring> using namespace std; stack<char>s1,s2; char now; int main(){string c;cin>>c;for(int i0;…

微信视频号导出视频软件

最近研究了一下微信视频号导出视频的方法&#xff0c;目前发现还是比较难搞&#xff0c;查了一些资料&#xff0c;写了一个可以导出视频的软件&#xff0c;目前还不完善&#xff0c;但是导出视频到本地还是没问题&#xff0c;先用着吧&#xff0c;后期再完善。先记录一下。 测…

人工智能浪潮下,程序员如何锻造不可替代的核心竞争力?

人工智能时代&#xff0c;程序员如何保持核心竞争力&#xff1f; 在人工智能时代&#xff0c;程序员如何保持核心竞争力是一个值得深思的问题。随着技术的快速发展&#xff0c;特别是AI技术的不断进步&#xff0c;程序员的角色和工作方式正在经历前所未有的变革。以下是一些关…

docker部署Stirling-PDF

github网址&#xff1a; GitHub - Stirling-Tools/Stirling-PDF: #1 Locally hosted web application that allows you to perform various operations on PDF files 1、官方docker镜像无法拉取&#xff0c;使用别人阿里云私人镜像仓库下载Stirling-PDF镜像&#xff1a; regi…

如何设置word页码从指定页开始

如何设置word页码从指定页开始 在使用Word编辑一些比较正式的文档时&#xff0c;封面页或者是前几页都是不能有页码的&#xff0c;那么怎么设置页码从指定页开始&#xff0c;可以通过分隔符来实现页码从指定页开始。 word设置页码从指定页开始的具体步骤如下&#xff1a; 1.…

2024.9最新:CUDA安装,pytorch库安装

目录 一、CUDA安装 1.查看自己电脑适配的CUDA的最高版本 2.安装CUDA 3.检查环境变量是否配置&#xff0c;安装是否成功 二、pytorch库安装 1.pytorch库下载 2.选择合适的版本 3.查看版本 一、CUDA安装 1.查看自己电脑适配的CUDA的最高版本 在命令提示符里输入nvidia-…

LeetCode题集-4 - 寻找两个有序数组的中位数,图文并茂,六种解法,万字讲解

题目&#xff1a;给定两个大小分别为 m 和 n 的正序&#xff08;从小到大&#xff09;数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log (mn)) 。 作为目前遇到的第一个困难级别题目&#xff0c;我感觉这题还是挺难的&#xff0c…

MATLAB 从 R2024B 开始支持树莓派 5

树莓派&#xff08;Raspberry Pi&#xff09;系列是一系列基于单板计算机的微型电脑&#xff0c;由英国的树莓派基金会于 2012 年开始发布。它的目标是提供一个低成本、易于学习和玩耍的平台&#xff0c;用于教育和初学者学习计算机科学和编程。 目前市面上&#xff0c;最新最…

工地高空安全防护装备检测系统源码分享

工地高空安全防护装备检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of …

Linux驱动.之中断系统,裸机下设置寄存器,绑定中断处理函数hander(二)

17.3.3通用中断驱动文件编写 在start.S文件中我们在中断服务函数IRQ_Handler中调用了C函数system_irqhandler来处理具体的中断。此函数有一个参数&#xff0c;参数是中断号&#xff0c;但是函数system_irqhandler的具体内容还没有实现&#xff0c;所以需要实现函数system_irqha…

大屏可视化适配方案

大屏适配方案 方案一&#xff1a;rem 单位 动态设置 html 的 font-size&#xff1b;方案二&#xff1a;vw 单位&#xff1b;方案三&#xff1a;scale 等比例缩放 对比 方案一 核心思想&#xff1a;动态调整 HTML 根字体大小和 body 字体大小&#xff0c;结合百分比或vw/vh单…

配置cobbler服务提供centos7安装源

cobbler服务和pxe服务的作用类似但是从安装部署角度来说比pxe简单得多。 cobbler可以用来快速建立Linux网络安装环境&#xff0c;大幅度降低了Linux网络安装的技术门槛。 一.cobbler介绍 由RedHat公司基于python语言开发&#xff0c; 作用&#xff1a;快速批量部署Linux系统…

艾里斑(Airy Disk)与瑞利判据(Rayleigh criterion)

艾里斑的定义与形成 艾里斑&#xff08;Airy Disk&#xff09;&#xff0c;又称艾里图样&#xff08;Airy Pattern&#xff09;&#xff0c;是光通过圆形孔径发生衍射时&#xff0c;在焦点处形成的光斑。这一现象由英国数学家和天文学家George Biddell Airy在19世纪首次详细描…

面试官问:你在团队中的角色是什么?

面试官问你在团队中的角色是什么&#xff0c;其目的是了解你如何在团队环境中工作&#xff0c;以及你如何看待自己在团队中的定位。他们希望听到你如何与他人协作、你的领导能力或团队合作精神&#xff0c;以及你是否能适应不同的团队角色。 回答这类问题时&#xff0c;你可以…

shiro漏洞复现

目录 shiro介绍框架介绍判断是否使用shiro框架 环境搭建CVE-2010-3863漏洞原理影响版本漏洞复现 CVE-2016-4437漏洞原理影响版本漏洞复现 CVE-2020-1957漏洞原理影响版本漏洞复现 shiro-721拉取环境漏洞原理漏洞复现 shiro介绍 框架介绍 Apache Shiro提供了认证、授权、加密和…

关于手机号码数理的计算和推导,获得“平替”尾号

文章背景&#xff1a;我个人比较相信命运&#xff0c;对于手机号码的吉凶或是数理颇为在乎。最近&#xff0c;我沉浸于这方面的研究中&#xff0c;并发现许多手机号码的数理核心竟出奇地一致——关键在于后四位尾号&#xff0c;而前面的数字似乎并不占据主导位置。然而&#xf…