链表常见题|删除链表、合并链表、环形链表、相交链表、反转链表、回文链表

链表常见题|删除链表、合并链表、环形链表、相交链表、反转链表、回文链表

文章目录

2.两数相加

/*** 两数相加*/
public class $2 {public ListNode addTwoNumbers(ListNode l1, ListNode l2) {ListNode head = new ListNode(-1);ListNode cur = head;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);if (l1 != null) {l1 = l1.next;}if (l2 != null) {l2 = l2.next;}cur = cur.next;}if (carry != 0) {cur.next = new ListNode(carry);}return head.next;}
}

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

删除链表的倒数第 n 个节点

特殊值考虑:head==null; head.next==null&&n==1

1.fast先走n步

2.若n大于链表长度时,删除头结点

3.fast和slow同时走,直到fast.next==null

4.删除,slow所指向的节点即为被删除节点的前序节点

在这里插入图片描述

/*** 删除链表的倒数第 n 个节点* 特殊值考虑:head==null; head.next==null&&n==1* 1.fast先走n步* 2.若n大于链表长度时,删除头结点* 3.fast和slow同时走,直到fast.next==null* 4.删除,slow所指向的节点即为被删除节点的前序节点*/
public class $19 {public ListNode removeNthFromEnd(ListNode head, int n) {if (head == null) {return null;}if (head.next == null && n == 1) {  //保证n是有效的,说明n只可能为1?return null;}ListNode fast = head;ListNode slow = head;for (int i = 0; i < n; i++) {fast = fast.next;}if (fast == null) { //要注意链表长度 == n时,会fast会越界return head.next;}while (fast.next != null) {fast = fast.next;slow = slow.next;}slow.next = slow.next.next;return head;}public ListNode removeNthFromEnd2(ListNode head, int n) {if (head == null) {return null;}//([1], 1)if (head.next == null && n == 1) {return null;}ListNode fast = head;ListNode slow = head;//1.fast先走n步for (int i = 0; i < n; i++) {fast = fast.next;}//2.若n大于链表长度时,删除头结点if (fast == null) {return head.next;}//3.fast和slow同时走while (fast.next != null) {fast = fast.next;slow = slow.next;}//4.删除//slow所指向的节点即为被删除节点的前序节点slow.next = slow.next.next;return head;}
}

21.合并两个有序链表

/*
合并两个有序链表*/
public class $21 {public ListNode mergeTwoLists2(ListNode list1, ListNode list2) {ListNode head = new ListNode(-1);ListNode cur = head;while (list1 != null && list2 != null) {if (list1.val < list2.val) {cur.next = new ListNode(list1.val);list1 = list1.next;} else {cur.next = new ListNode(list2.val);list2 = list2.next;}cur = cur.next;}if (list1 != null) {cur.next = list1;}if (list2 != null) {cur.next = list2;}return head.next;}
}

141.环形链表

  • 使用快慢指针,若两指针重合,说明有环
  • 注:循环条件的顺序
  • 判断指针相等,要在先前进之后
/*** 使用快慢指针,若两指针重合,说明有环* 注:循环条件的顺序* 判断指针相等,要在先前进之后*/
public class $141 {public static boolean hasCycle(ListNode head) {ListNode fast = head;ListNode slow = head;while (fast != null && fast.next != null) {fast = fast.next.next;slow = slow.next;if (fast == slow) {return true;}}return false;}
}

142.环形链表 II

当快慢指针重合的时候,head到入环结点的距离等于重合结点到入环节点的距离

在这里插入图片描述

/*** 当快慢指针重合的时候,head到入环结点的距离等于重合结点到入环节点的距离*/
public class $142 {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) {break;}}//不带环的情况// fast == slow 不能证明链表带环,比如链表只有一个节点if (fast == null || fast.next == null) {return null;}//cur 和 fast 同时走相同的步数//循环条件:cur != fast,若一开始 cur = fast说明两者已在入环结点ListNode cur = head;while (cur != fast) {cur = cur.next;fast = fast.next;}return cur;}
}

160.相交链表

法一:

1.让较长的链表的先走差值步

2.两个链表同时走

3.若相等,则有相交点 *

法二:让两个链表从同距离末尾同等距离的位置开始遍历,其中一个位置是较短链表的头结点位置。

1.指针 pA 指向 A 链表,指针 pB 指向 B 链表,依次往后遍历

2.如果 pA 到了末尾,则 pA = headB 继续遍历

3.如果 pB 到了末尾,则 pB = headA 继续遍历

4.比较长的链表指针指向较短链表head时,长度差就消除了

在这里插入图片描述

/*** 法一:* 1.让较长的链表的先走差值步* 2.两个链表同时走* 3.若相等,则有相交点*/
public class $160 {//法一:public ListNode getIntersectionNode(ListNode headA, ListNode headB) {//1.两个链表的长度int lenA = size(headA);int lenB = size(headB);int k = 0;int flg = 1;//2.长的链表先走长度差步if (lenA>lenB) {k = lenA - lenB;} else {k = lenB - lenA;flg = 0;}if (flg == 1) {for (int i = 0; i < k; i++) {headA = headA.next;}} else {for (int i = 0; i < k; i++) {headB = headB.next;}}//3.两个链表同时走while (headA != null && headB != null) {if (headB == headA) {return headB;}headA = headA.next;headB = headB.next;}return null;}private static int size(ListNode head) {int len = 0;for (ListNode node = head; node != null; node = node.next) {len++;}return len;}
}
/**** 法二:让两个链表从同距离末尾同等距离的位置开始遍历,其中一个位置是较短链表的头结点位置。* 1.指针 pA 指向 A 链表,指针 pB 指向 B 链表,依次往后遍历* 2.如果 pA 到了末尾,则 pA = headB 继续遍历* 3.如果 pB 到了末尾,则 pB = headA 继续遍历* 4.比较长的链表指针指向较短链表head时,长度差就消除了*/
public class $160 {//法二public ListNode getIntersectionNode2(ListNode headA, ListNode headB) {ListNode pA = headA;ListNode pB = headB;while (pA != pB) {pA = pA == null ? headB : pA.next;pB = pB == null ? headA : pB.next;}return pA;}
}

206.反转链表

在这里插入图片描述

/*** 反转链表*/
public class $206 {public ListNode reverseList2(ListNode head) {if (head == null) {return null;}ListNode prev = null;ListNode cur = head;while (cur != null) {ListNode next = cur.next;cur.next = prev;prev = cur;cur = next;}return prev;}
}

234.回文链表

1.找到链表的中间节点

2.中间节点之后的链表反转

3.比较

在这里插入图片描述

/*** 链表的回文* 1.找到链表的中间节点* 2.中间节点之后的链表反转* 3.比较*/
public class $234 {public boolean isPalindrome2(ListNode head) {//1.找到链表的中间节点ListNode mid = getMidNode(head);//2.反转链表ListNode rev = revList(mid.next);//3.比较ListNode l1 = head;ListNode l2 = rev;while (l1 != null && l2 != null) {if (l1.val != l2.val) {return false;}l1 = l1.next;l2 = l2.next;}return true;}private ListNode getMidNode(ListNode head) {ListNode fast = head;ListNode slow = head;while (fast.next != null && fast.next.next != null) {fast = fast.next.next;slow = slow.next;}return slow;}private ListNode revList(ListNode head) {ListNode prev = null;ListNode cur = head;while (cur != null) {ListNode next = cur.next;cur.next = prev;prev = cur;cur = next;}return prev;}
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++-类和对象(1)

1.面向过程和面向对象初步认识 C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题。 C是基于面向对象的&#xff0c;关注的是对象&#xff0c;将一件事情拆分成不同的对象&#xff0c;靠对象之间的交互完 成。…

SpringBoot 3.2.0 基于SpringDoc接入OpenAPI实现接口文档

依赖版本 JDK 17 Spring Boot 3.2.0 SpringDoc 2.3.0 工程源码&#xff1a;Gitee 导入依赖 <properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEnco…

深入剖析LinkedList:揭秘底层原理

文章目录 一、 概述LinkedList1.1 LinkedList简介1.2 LinkedList的优点和缺点 二、 LinkedList数据结构分析2.1 Node节点结构体解析2.2 LinkedList实现了双向链表的原因2.3 LinkedList如何实现了链表的基本操作&#xff08;增删改查&#xff09;2.4 LinkedList的遍历方式 三、 …

SQL server 数据库练习题及答案(练习2)

使用你的名字创建一个数据库 创建表&#xff1a; 数据库中有三张表&#xff0c;分别为student,course,SC&#xff08;即学生表&#xff0c;课程表&#xff0c;选课表&#xff09; 问题&#xff1a; --1.分别查询学生表和学生修课表中的全部数据。--2.查询成绩在70到80分之间…

dhcp的配置

原理 就是服务器&#xff08;路由器或者交换机分配网段&#xff09; 动态分配 接口资源池 全局资源池 静态分配 实验 ar1 ip地址 r1-r3 dhcp en 打开dhcp en 第三步 配置地址池 接口 进入端口 dhcp select interface 设置接口资源池 dhcp server dns-…

5G NR无线蜂窝系统的信道估计器设计

文章目录 DMRS简介DMRS类型DMRS频域密度 信道估计实验仿真实验参数实验实验结论 DMRS简介 DMRS类型 类型A&#xff1a;DMRS位于时隙的第二个或第三个OFDM符号&#xff0c;由14个OFDM符号组成&#xff0c;当数据占据大部分时隙时使用A型映射。 类型B&#xff1a;用在URLLC中&a…

【Mybatis】深入学习MyBatis:概述、主要特性以及配置与映射

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; Mybatis ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 一、概述 MyBatis简介 主要特性 1. 动态SQL 2.结果映射 3 .插件机制 二、MyBatis配置文件 1.配置文件结构 数据库连…

15 款Python编辑器的优缺点,别再问我“选什么编辑器”

本文介绍了多个 Python IDE&#xff0c;并评价其优缺点。读者可以参考此文列举的 Python IDE 列表&#xff0c;选择适合自己的编辑器。 写 Python 代码最好的方式莫过于使用集成开发环境&#xff08;IDE&#xff09;了。它们不仅能使你的工作更加简单、更具逻辑性&#xff0c;…

Spring Boot整合MyBatis-Plus框架快速上手

最开始&#xff0c;我们要在Java中使用数据库时&#xff0c;需要使用JDBC&#xff0c;创建Connection、ResultSet等&#xff0c;然后我们又对JDBC的操作进行了封装&#xff0c;创建了许多类似于DBUtil等工具类。再慢慢的&#xff0c;出现了一系列持久层的框架&#xff1a;Hiber…

GBase南大通用-GBase 8a资源管理功能试用

环境&#xff1a;centos7.9&#xff1b;GBase 8a V9.5.3.27 资源管理功能简介 GBase南大通用的GBase 8a MPP Cluster 资源管理功能可以对 SELECT 和 DML 等受控 SQL 在运 行过程中使用的 CPU、内存、I/O 和磁盘空间等资源进行合理管控&#xff0c;以达到资 源合理利用&#x…

【toolschain algorithm cpp ros】cpp工厂模式实现--后续填充具体规划算法,控制器版的已填充了算法接入了仿真器

写在前面 现在局势危机&#xff0c;于是想复习一下之前写的设计模式&#xff0c;之前提到&#xff0c;做过一个闭环仿真器&#xff08;借用ros&#xff09;&#xff0c;见https://blog.csdn.net/weixin_46479223/article/details/134864123我的控制器的建立遵循了工厂模式&…

【低照度图像增强系列(2)】Retinex(SSR/MSR/MSRCR)算法详解与代码实现

前言 ☀️ 在低照度场景下进行目标检测任务&#xff0c;常存在图像RGB特征信息少、提取特征困难、目标识别和定位精度低等问题&#xff0c;给检测带来一定的难度。 &#x1f33b;使用图像增强模块对原始图像进行画质提升&#xff0c;恢复各类图像信息&#xff0c;再使用目标检…

C#与php自定义数据流传输

C#与php自定义数据流传输 介绍一、客户端与服务器数据传输流程图客户端发送数据给服务器&#xff1a;服务器返回数据给客户端&#xff1a; 二、自定义数据流C#版本数据流PHP版本数据流 三、数据传输测试1.在Unity中创建一个C#脚本NetWorkManager.cs2.服务器www目录创建StreamTe…

【Linux驱动】驱动框架的进化 | 总线设备驱动模型

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《Linux驱动》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 目录 &#x1f969;驱动框架的进化&#x1f960;分层&#x1f960;面向对象&#x1f960;编程&am…

使用 Jekyll 构建你的网站 - 初入门

文章目录 一、Jekyll介绍二、Jekyll安装和启动2.1 配置Ruby环境1&#xff09;Windows2&#xff09;macOS 2.2 安装 Jekyll2.3 构建Jekyll项目2.4 启动 Jekyll 服务 三、Jekyll常用命令四、目录结构4.1 主要目录4.2 其他的约定目录 五、使用GitLink构建Jekyll博客5.1 生成Jekyll…

同义词替换器降低论文重复率的最新技术解析

大家好&#xff0c;今天来聊聊同义词替换器降低论文重复率的最新技术解析&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff0c;可以借助此类工具&#xff1a; 标题&#xff1a;同义词替换器降低论文重复率的最…

跟着LearnOpenGL学习11--材质

文章目录 一、材质二、设置材质三、光的属性四、不同的光源颜色 一、材质 在现实世界里&#xff0c;每个物体会对光产生不同的反应。 比如&#xff0c;钢制物体看起来通常会比陶土花瓶更闪闪发光&#xff0c;一个木头箱子也不会与一个钢制箱子反射同样程度的光。 有些物体反…

使用Clion配置Qt开发过程中的很多坑

如果你想使用Clion开发Qt软件 如果你想在Windows上使用Clion开发Qt 如果你还想使用MSVC编译器开发Qt 但是却遇到了各种各种编译报错&#xff0c;那么恭喜你这些坑都有人帮你踩过了 报错一 CMake Error at CMakeLists.txt:25 (find_package):Could not find a package config…

冒泡排序(C语言)

void BubbleSort(int arr[], int len) {int i, j, temp;for (i 0; i < len; i){for (j len - 1; j > i; j--){if (arr[j] > arr[j 1]){temp arr[j];arr[j] arr[j 1];arr[j 1] temp;}}} } 优化&#xff1a; 设置标志位flag&#xff0c;如果发生了交换flag设置…

西南科技大学计算机网络实验二 (IP协议分析与以太网协议分析)

一、实验目的 通过分析由跟踪执行traceroute程序发送和接收捕获得到的IP 数据报,深入研究在IP 数据报中的各种字段,理解IP协议。基于ARP命令和Ethereal进行以太网帧捕获与分析,理解和熟悉ARP协议原理以及以太网帧格式。 二、实验环境 与因特网连接的计算机网络系统;主机操…