常见链表的操作题+代码

news2024/11/15 21:51:15

文章目录

    • leetcode 2 两数相加
    • leetcode 19删除链表中的倒数第N个节点
    • leetcode 21合并两个有序链表
    • leetcode 24两两交换链表中的节点
    • leetcode 25k个一组链表反转
    • leetcode 61旋转链表

leetcode 2 两数相加

两个链表对应的值进行相加,如何计算呢?

考虑点,如果长度为3的,和长度为2的如何计算,应该是左对齐的,到第三位的时候,如果为null,应该返回值0,这里可以采用三元运算符来求解

采用虚拟的头节点;

如何解决进位问题呢?讲x+y取模10,对应的是哪个位上的值,然后(x+y)/10得到如果大于1,就是往前进了一个,那么需要加入到下一次的循环中去,循环的条件就是两个对应的指针有一个不为null即可。

解决进位问题,

class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {

        //为什么学完总是忘记呢?
        //pre是这个节点的最前面的,cur等于当前的节点。
        ListNode pre=new ListNode(0); //创建的一个节点
        ListNode cur=pre;
        int carry=0;
        while (l1!=null||l2!=null){
            //这边的小技巧,采用三元运算符
            int x=l1==null?0:l1.val;
            int y=l2==null?0:l2.val;
            int sum=x+y+carry;

            carry=sum/10;

            sum=sum%10;

            cur.next=new ListNode(sum);

            cur=cur.next;

            //l1和l2往下进行移动
            if (l1!=null)
            {
                l1=l1.next;
            }
            if (l2!=null){
                l2=l2.next;
            }
          }

        if (carry==1){
            cur.next=new ListNode(carry); //后面在添加一个节点
        }
        return pre.next;

    }
}

leetcode 19删除链表中的倒数第N个节点

直接操作是不知道对应链表的长度的,那么如何操作呢?
可以遍历一遍对应的链表获取到当前链表的长度。

这道题为什么需要设置头节点,设置一个头节点,走N次,身下K-N次,然后两个节点都走K-N次,刚好是倒数第N个节点,不太好操作,只是知道当前的节点而已,不知道下面的节点。
那么如何操作呢?需要加入头节点,这样就会在倒数第k-N+1个节点的位置,那样即可删除掉倒数第N个节点。

class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode dummy = new ListNode(0, head);
        
        ListNode first = head;
        
        ListNode second = dummy;
        
        for (int i = 0; i < n; ++i) {
            first = first.next;
        }
        while (first != null) {
            first = first.next;
            second = second.next;
        }
        //删除倒数第N个节点;
        second.next = second.next.next;
        
        ListNode ans = dummy.next;
        
        return ans;
    }
}

leetcode 21合并两个有序链表

在这里插入图片描述
在这里插入图片描述

class Solution {
    public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
         //讲两个升序链表合并为新的升序链表返回。

        //递归方式不断往里面去走,结束的条件就是有一个为null,直接返回;
        if (list1==null){
            return list2;
        }else if (list2==null){
            return list1;
        }else if (list1.val<list2.val){
            //如果l1小,那么就需要合并l1
            list1.next=mergeTwoLists(list1.next,list2);
            return list1;
        }else{
            //合并l2,
            list2.next=mergeTwoLists(list1,list2.next);
            return list2;
        }
    }
}

leetcode 24两两交换链表中的节点

class Solution {
    public ListNode swapPairs(ListNode head) {
         //两两交换链表中的节点
        //递归解法
        if (head==null||head.next==null){
            return head;
        }
        ListNode next=head.next;
        head.next=swapPairs(next.next); //不断的往里面进行递归,不断的调用,到head==null或者下面等于null返回

        next.next=head;
        //返回头节点等于head;
        return next;
    }
}

不采用递归的方式去写,采用循环的方式,链表之间的操作去写。定义一个虚拟头节点dummy,定义一个cur指针指向虚拟头节点,条件需要的是因为两两交换需要cur.next和cur.next.next都不为null才可以;
在这里插入图片描述

leetcode 25k个一组链表反转

这道题有多个部分组成的,首先是反转单链表需要知道,然后如何处理k个一组的链表,反转之后如何操作
设置的双指针的思想,end指针先移动k个,然后讲后面的断掉,反转start指针的链表,反转之后end在前面了,start在后面了,讲start和后面的节点继续连接起来,然后end和pre节点都回到start上面开始下一次的遍历,如果遍历的时候end指向了null说明是最后节点是不用反转的,此时只需要break结束循环;

class Solution {
    public ListNode reverseKGroup(ListNode head, int k) {
          ListNode dummy=new ListNode(0);
          dummy.next=head;
          ListNode pre=dummy;
          ListNode end=dummy; //虚拟节点
        //没k组进行反转,如果小于k组那么就不需要反转

        //反转单链表,可以采用递归的方式,也可以不用递归;

        while (end.next!=null){
            //从头节点开始 移动k位
            for (int i=0;i<k && end!=null;i++) end=end.next; //移动k位;
            if (end==null) break; //如果当前位null就直接结束了
            ListNode start=pre.next;
            ListNode next=end.next; //为了下一次的连接

            end.next=null; //断开连接
            pre.next=reverse(start);

            start.next=next; //反转之后start是结尾了,在连起来

            pre=start; //移动位置,讲pre 和end连接到start上面
            end=pre;
        }
        return dummy.next;
    }

    //反转一个节点
    public  ListNode reverse(ListNode head){
        ListNode pre=null;
        ListNode curr=head;
        while (curr!=null){
            ListNode next= curr.next;
            curr.next=pre;
            pre=curr;
            curr=next;
        }
        return  pre;
    }
}

leetcode 61旋转链表

思路 旋转链表
讲链表向右移动k位

在这里插入图片描述计算链表的长度为n,需要计算k%n,如果等于0,操作了对应长度的次数,那么链表还是不会发生变化的。
占村现在的尾节点,尾节点最后指向最后前部分的节点。
while循环让node指向到n-k个,tail.next=head;
ListNode newHead=node.next; //开始了新的节点,最后需要将这个节点的下一个为null。
防止链表成环。

class Solution {
    public ListNode rotateRight(ListNode head, int k) {
            //讲最后一个节点断开指向第一个节点
        //如何找到最后一个节点呢?
        if (head==null) return head; // 链表为空直接返回

        ListNode node=head; //用于遍历链表和定位尾节点
        int n=1;//初始值尾1,表示头节点

        while (node.next!=null){
            n++;
            node=node.next; //遍历对应的节点
        }

        k%=n; //k除以n
        if (k==0) return head; //反转n次相当于不变的
        //tail尾节点
        ListNode tail=node ;//暂存头节点。最后的尾节点,尾节点来拼接前半部分的节点的
        //node有重新回到头节点
        node=head;

        while (n-->k+1) node=node.next; //向右移动k次,需要先移动

        tail.next=head;//玮节点指向头节点
        // 重新拼接[1, n - k]部分节点和[n - k + 1, n]部分节点,即变为[n - k + 1, n] + [1, n - k]
        //newhead等于node的下一个,就是对应的后面新节点
        ListNode newHead=node.next;

        node.next=null; //对的这边起始是没有切掉的2后面就是对应的新节点,然后需要讲2后面的切掉,不然链表就会成环了

        return newHead;

    }
}

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

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

相关文章

2.3 数据模型

思维导图&#xff1a; 前言&#xff1a; 我的理解&#xff1a; 这段话介绍了概念模型和数据模型之间的关系&#xff0c;以及数据模型的定义和重要性。具体解读如下&#xff1a; 1. **概念模型**&#xff1a;它是一种描述现实世界数据关系的抽象模型&#xff0c;不依赖于任何…

unity 场景烘培(边学习,边记录)

前言&#xff1a;好记性不如烂笔头&#xff0c;本文只提供参考&#xff01; 问题总结&#xff1a;1.unity 场景烘焙问题之模型UV有重叠_野区捕龙为宠的博客-CSDN博客 一、光源种类&#xff08;摘录&#xff1a;Unity灯光&#xff08;light&#xff09;_浮影℡的博客-CSDN博客…

Win10搭建VisualSvn Server

Win10搭建VisualSvn Server 目录 Win10搭建VisualSvn Server一、下载VisualSvn Server安装包二、安装VisualSvn Server三、配置和使用VisualSVN Server四、添加用户及权限设定方法五、创建目录及配置权限 1、服务端&#xff1a;有集成了Subversion和Apache、安装使用非常简单且…

软件第三方验收测评介绍

软件第三方验收测试 软件项目验收测试介绍&#xff1a; 软件项目验收测试是部署软件之前的最后一个测试操作&#xff0c;是对系统进行全面的测试&#xff0c;以验证其是否符合合同要求&#xff0c;出具第三方测试报告&#xff0c;为系统验收提供依据。 验收测试的目的是&…

【Ambari】Python调用Rest API 获取集群状态信息并发送钉钉告警

&#x1f341; 博主 "开着拖拉机回家"带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——&#x1f390;开着拖拉机回家_大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341; 希望本文能够给您带来一定的帮助&#x1f338;文…

RFA01无线麦克风无线音频模块

1、简介 RFA01无线麦克风模块&#xff0c; 是一款支持2.4G私有协议无线麦克风、无线音频模块&#xff0c;支持秒连、低延时、低功耗、高音质的特性。支持串口AT指令&#xff0c;支持外挂PA射频放大器。主从之间可实现数据的传输功能。 2、模块实物图片 3、模块功能说明 4、模块…

python 深度学习 解决遇到的报错问题3

目录 一、AttributeError: The vocab attribute was removed from KeyedVector in Gensim 4.0.0. 二、ImportError: cannot import name logsumexp 三、FutureWarning: Passing (type, 1) or 1type as a synonym of type is deprecated; in a future version of numpy, it w…

【Interaction交互模块】ActionPublisher/ActionReciever

文章目录 需求案例原理0、相应准备1、发布器、接收器2、将把两者联系起来3、前提状态 补充 需求 Interactor只能将一个动作&#xff08;如按下手柄抓取键&#xff09;&#xff0c;传递给Interactble,如果要传两个或多个&#xff0c;就需要用发布器和接收器。 案例 右手柄抓取…

常见网络通信协议(http、https、ws)及安全协议(SSL、TLS、XTLS)

文章内容删除了一大半不合适的内容&#xff0c;发不出来&#xff0c;你懂得。&#x1f970; 一、常见网络通信协议1.1、HTTP 协议1.11 HTTP 协议简介1.12 HTTP 协议的工作流程1.13 HTTP 协议的常用方法1.14 HTTP 协议的常见状态码1.15 HTTP 的缺点 1.2 HTTPS 协议1.21 HTTPS 协…

生态系统模型Biome-BGC、InVEST模型、PLUS模型、SolVES模型、CENTURY模型、CASA模型、生态系统NPP等应用

目录 一、Biome-BGC介绍 二、Linux应用、CDO工具应用、Python应用 三、数据处理实践 四、单点的模拟 五、区域模拟-1 六、区域模拟-2 七、长时间序列模拟案例实践 更多应用 在Biome-BGC模型中&#xff0c;对于碳的生物量积累&#xff0c;采用光合酶促反应机理模型计算…

IDEA2023隐藏.idea和.iml文件

IDEA2023隐藏.idea和.iml文件 1. 打开file -> setting,快捷键CtrlAlts2. Editor -> File types3. 点击右侧Ignore files and folders一栏4. 添加需要忽略的文件5. 最重要一步 IDEA新建项目会自动生成一个.idea文件夹和.iml文件&#xff0c;开发中不需要对这两个文件修改&…

更改系统所有错误的注册表路径

应用场景 系统文件夹由中文变更为英文后&#xff0c;部分软件在更新时出现找不到对应路径错误 原路径&#xff1a; C:\Users\一颗橘子 改后路径&#xff1a; C:\Users\Orange 问题分析 修改系统文件夹后&#xff0c;对应没有修改软件的注册表信息&#xff0c;仍存在 C:\Users\一…

图神经网络教程之GCN(pyG)

图神经网络-pyG版本的GCN Data&#xff08;数据&#xff09; data.x、data.edge_index、data.edge_attr、data.y、data.pos 举个例子 import torch from torch_geometric.data import Data edge_index torch.tensor([[0, 1, 1, 2],[1, 0, 2, 1]], dtypetorch.long) #代表…

博客系统 Java Web 开发(Servlet)

目录 一、准备工作 二、设计数据库 三、编写数据库代码 1、建表sql 2、封装数据库的连接操作 3、创建实体类 4、封装数据库的一些增删改查 &#xff08;1&#xff09;BlogDao 新增博客&#xff1a; 根据博客 id 来查询指定博客&#xff08;用于博客详情页&#xff0…

【配置环境】Visual Studio 配置 OpenCV

目录 一&#xff0c;环境 二&#xff0c;下载和配置 OpenCV 三&#xff0c;创建一个 Visual Studio 项目 四&#xff0c;配置 Visual Studio 项目 五&#xff0c;编写并编译 OpenCV 程序 一&#xff0c;环境 Windows 11 家庭中文版Microsoft Visual Studio Community 2022…

【每日运维】RockyLinux8.6升级OpenSSH9.4p1

为什么需要升级openssh呢&#xff0c;因为很多项目进行漏扫结果都会涉及到这个服务器核心组件&#xff0c;一想到以前升级openssh带来的各种依赖性问题就头疼&#xff0c;不管是什么发行版&#xff0c;升级这个东西真的很烦&#xff0c;这次发现可能还会有好一点的通用一点的升…

Docker最简单的来部署前端vue打包好的h5代码

Docker最简单的来部署前端vue打包好的h5代码 前言 是不是想在服务器上部署好几个前端页面&#xff0c;并且也不想让各个页面之间进行隔离&#xff0c;还有就是想要一键部署&#xff0c;实时更新到服务区上&#xff0c;那这篇文章可能帮到您 这里也得选择一个软件叫Idea&#x…

Web3的新商业综合体——SMT震撼来袭!

SMT元宇宙应用生态平台&#xff0c;致力于打造一个Web3.0的新商业综合体。作为一个基础公链系统&#xff0c;SMT各项性能能够完全满足现在当下的各种应用&#xff0c;以及它们的部署。 用区块链技术和新的商业模式体现P2E并实现一个共建共享的理念&#xff0c;重塑大众生活的衣…

Python Qt学习(九)MainWindow

源代码&#xff1a; # -*- coding: utf-8 -*-# Form implementation generated from reading ui file qt_mainwindow.ui # # Created by: PyQt5 UI code generator 5.15.9 # # WARNING: Any manual changes made to this file will be lost when pyuic5 is # run again. Do n…

python面试题合集(一)

python技术面试题 1、Python中的幂运算 在python中幂运算是由两个 **星号运算的&#xff0c;实例如下&#xff1a; >>> a 2 ** 2 >>> a 4我们可以看到2的平方输出结果为4。 那么 ^指的是什么呢&#xff1f;我们用代码进行演示&#xff1a; >>>…