算法题目总结-链表

文章目录

    • 1.环形链表
        • 1.答案
        • 2.思路
    • 2.两数相加
        • 1.答案
        • 2.结果
    • 3.反转链表
        • 1.答案
        • 2.思路
    • 4.反转链表 II
        • 1.答案
        • 2.思路
    • 5.K 个一组翻转链表
        • 1.答案
        • 2.思路
    • 6.删除链表的倒数第 N 个结点
        • 1.答案
        • 2.思路
    • 7.删除排序链表中的重复元素 II
        • 1.答案
        • 2.思路
    • 8.旋转链表
        • 1.答案
        • 2.思路
    • 9.LRU 缓存
        • 1.答案
        • 2.思路
    • 10.两两交换链表中的节点
        • 1.答案
        • 2.思路
    • 11.环形链表 II
        • 1.答案
        • 2.思路

1.环形链表

1.答案
package com.sunxiansheng.arithmetic.day11;import com.sunxiansheng.arithmetic.util.ListNode;/*** Description: 141. 环形链表** @Author sun* @Create 2025/1/16 10:36* @Version 1.0*/
public class t141 {public boolean hasCycle(ListNode head) {// 快慢指针ListNode slow = head;ListNode fast = head;while (fast != null && fast.next != null) {slow = slow.next;fast = fast.next.next;// 只要相遇了,就是有环if (slow == fast) {return true;}}return false;}
}
2.思路

快慢指针,只要相遇,就有环

2.两数相加

1.答案
package com.sunxiansheng.arithmetic.day11;import com.sunxiansheng.arithmetic.util.ListNode;/*** Description: 2. 两数相加** @Author sun* @Create 2025/1/16 10:39* @Version 1.0*/
public class t2 {public ListNode addTwoNumbers(ListNode l1, ListNode l2) {// 结果的头节点ListNode res = new ListNode(-1);ListNode cur = res;// 进位int carry = 0;// 遍历两个链表的指针ListNode t1 = l1, t2 = l2;// 只要两个链表有一个不为空就进行遍历while (t1 != null || t2 != null) {// 获取两个节点的值int var1 = t1 == null ? 0 : t1.val;int var2 = t2 == null ? 0 : t2.val;// 求和int sum = var1 + var2 + carry;// 用完进位之后要恢复0carry = 0;// 判断是否要进位if (sum > 9) {carry = sum / 10;sum = sum % 10;}// 给结果赋值cur.next = new ListNode(sum);cur = cur.next;// 移动指针if (t1 != null) {t1 = t1.next;}if (t2 != null) {t2 = t2.next;}}// 检查是否还有没处理的进位if (carry > 0) {cur.next = new ListNode(carry);}return res.next;}
}
2.结果

核心是有一个进位的字段,多注意即可

3.反转链表

1.答案
package com.sunxiansheng.arithmetic.day12;import com.sunxiansheng.arithmetic.util.ListNode;/*** Description: 206. 反转链表** @Author sun* @Create 2025/1/17 09:56* @Version 1.0*/
public class t206 {public ListNode reverseList(ListNode head) {if (head == null) {return null;}// 哨兵节点ListNode dummy = new ListNode(0);dummy.next = head;// prevListNode prev = dummy;// startListNode start = head;// thenListNode then = start.next;while (start.next != null) {start.next = then.next;then.next = prev.next;prev.next = then;then = start.next;}return dummy.next;}
}
2.思路

首先需要有prev、start、then,然后只要start.next不为空,就进行反转

4.反转链表 II

1.答案
package com.sunxiansheng.arithmetic.day12;import com.sunxiansheng.arithmetic.util.ListNode;/*** Description: 92. 反转链表 II** @Author sun* @Create 2025/1/17 09:52* @Version 1.0*/
public class t92 {public ListNode reverseBetween(ListNode head, int left, int right) {// 找到prev、start、then// 哨兵节点ListNode dummy = new ListNode(0);dummy.next = head;// 让cur指向left的前一个节点作为prevListNode cur = dummy;for (int i = 0; i < left - 1; i++) {cur = cur.next;}ListNode prev = cur;ListNode start = cur.next;ListNode then = start.next;// 遍历次数int count = right - left;for (int i = 0; i < count; i++) {start.next = then.next;then.next = prev.next;prev.next = then;then = start.next;}return dummy.next;}
}
2.思路

找到prev、start、then,然后遍历次数为right - left

5.K 个一组翻转链表

1.答案
package com.sunxiansheng.arithmetic.day12;import com.sunxiansheng.arithmetic.util.ListNode;/*** Description: 25. K 个一组翻转链表** @Author sun* @Create 2025/1/17 10:21* @Version 1.0*/
public class t25 {public ListNode reverseKGroup(ListNode head, int k) {// 哨兵节点ListNode dummy = new ListNode(0);dummy.next = head;ListNode cur = dummy;// 提前记录prevListNode prev = dummy;// 循环翻转while (true) {// 先判断有没有一组for (int i = 0; i < k; i++) {cur = cur.next;// 只要发现没有一组了,就返回结果if (cur == null) {return dummy.next;}}// 到这里就说明有一组,可以翻转链表ListNode start = prev.next;ListNode then = start.next;reverseGroup(prev, start, then, k);// 更新prevprev = start;// 更新curcur = prev;}}/*** 翻转一组链表** @param prev* @param start* @param then* @param k*/private void reverseGroup(ListNode prev, ListNode start, ListNode then, int k) {// 翻转次数int count = k - 1;for (int i = 0; i < count; i++) {start.next = then.next;then.next = prev.next;prev.next = then;then = start.next;}}
}
2.思路

就是先判断剩下的元素够不够k个,如果够就进行反转,翻转之后要更新prev和cur

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

1.答案
package com.sunxiansheng.arithmetic.day12;import com.sunxiansheng.arithmetic.util.ListNode;/*** Description: 19. 删除链表的倒数第 N 个结点** @Author sun* @Create 2025/1/17 10:44* @Version 1.0*/
public class t19 {public ListNode removeNthFromEnd(ListNode head, int n) {// 哨兵节点ListNode dummy = new ListNode(0);dummy.next = head;ListNode cur = dummy;// 求出一共有多少个节点int count = 0;while (cur.next != null) {cur = cur.next;count++;}// 倒数第n个节点的前一个节点的索引int index = count - n;cur = dummy;while (index > 0) {cur = cur.next;index--;}// 目前cur指向了前一个节点,可以开始删除节点了cur.next = cur.next.next;return dummy.next;}
}
2.思路

就是先找到一共有多少个节点,再找到倒数第n个节点的前一个节点然后删除

7.删除排序链表中的重复元素 II

1.答案
package com.sunxiansheng.arithmetic.day13;import com.sunxiansheng.arithmetic.util.ListNode;/*** Description: 82. 删除排序链表中的重复元素 II** @Author sun* @Create 2025/1/19 09:32* @Version 1.0*/
public class t82 {public static ListNode deleteDuplicates(ListNode head) {// 哨兵节点ListNode dummy = new ListNode(300);dummy.next = head;ListNode cur = dummy;// 记录前一个位置ListNode pre = dummy;while (cur.next != null) {cur = cur.next;if (cur.next == null || cur.val != cur.next.val) {pre = cur;} else {// 到这就说明pre的后两个元素相同// 记录一下值int val = cur.val;while (cur.next != null && val == cur.next.val) {cur = cur.next;}pre.next = cur.next;cur = pre;}}return dummy.next;}public static void main(String[] args) {ListNode head = new ListNode(1);head.next = new ListNode(1);head.next.next = new ListNode(1);head.next.next.next = new ListNode(2);head.next.next.next.next = new ListNode(3);deleteDuplicates(head);}
}
2.思路

就是有一个pre来记录前一个位置,每次循环都让cur先走一步,然后判断当前元素跟下一个元素是不是相同,如果不相同或者目前是最后一个元素,就让pre也指向cur,如果说当前元素跟下一个元素是相同的,那么就删除相同元素,最终让cur指向pre

8.旋转链表

1.答案
package com.sunxiansheng.arithmetic.day13;import com.sunxiansheng.arithmetic.util.ListNode;import java.util.List;/*** Description: 61. 旋转链表** @Author sun* @Create 2025/1/19 10:29* @Version 1.0*/
public class t61 {public ListNode rotateRight(ListNode head, int k) {if (head == null || head.next == null) {return head;}// 哨兵节点ListNode dummy = new ListNode(0);dummy.next = head;ListNode cur = dummy;// 计算链表总长度int length = 0;while (cur.next != null) {cur = cur.next;length++;}// 如果余数为0,则直接返回if (k % length == 0) {return head;}// 记录链表末尾元素ListNode end = cur;// 移动到正数第length - k % length个位置int index = length - k % length;cur = dummy;while (index > 0) {cur = cur.next;index--;}dummy.next = cur.next;// 切断,否则会有环cur.next = null;end.next = head;return dummy.next;}
}
2.思路

首先计算链表的总长度,然后记录链表末尾元素,再通过计算,找到正数第length - k % length个位置,然后根据题意进行组装,不过要注意切断一下,否则会有环

9.LRU 缓存

1.答案
package com.sunxiansheng.arithmetic.day13;import java.util.HashMap;
import java.util.Map;/*** Description: 146. LRU 缓存** @Author sun* @Create 2025/1/19 10:55* @Version 1.0*/
public class LRUCache {// 双向链表的节点class DLinkedNode {int key;int value;DLinkedNode prev;DLinkedNode next;public DLinkedNode() {}public DLinkedNode(int key, int value) {this.key = key;this.value = value;}}// 双向链表的头尾指针DLinkedNode head, tail;// map:key是key,value是双向链表的节点private Map<Integer, DLinkedNode> map;// 容量private int capacity;public LRUCache(int capacity) {map = new HashMap<>();this.capacity = capacity;// 头结点和尾节点head = new DLinkedNode();tail = new DLinkedNode();head.next = tail;tail.prev = head;}// 获取元素public int get(int key) {// 从map中去获取keyDLinkedNode dLinkedNode = map.get(key);if (dLinkedNode == null) {return -1;}// 获取之后,将元素放到链表头部moveToHead(dLinkedNode);return dLinkedNode.value;}private void moveToHead(DLinkedNode dLinkedNode) {// 首先需要在链表中删除这个元素delete(dLinkedNode);// 然后将元素插入到头部insertToHead(dLinkedNode);}private void insertToHead(DLinkedNode dLinkedNode) {dLinkedNode.next = head.next;dLinkedNode.prev = head;head.next.prev = dLinkedNode;head.next = dLinkedNode;}private static void delete(DLinkedNode dLinkedNode) {dLinkedNode.prev.next = dLinkedNode.next;dLinkedNode.next.prev = dLinkedNode.prev;}// 插入或更新元素public void put(int key, int value) {// 先获取元素DLinkedNode dLinkedNode = map.get(key);// 如果元素有值了,就替换值,并移动到头部if (dLinkedNode != null) {dLinkedNode.value = value;moveToHead(dLinkedNode);} else {// 没有值则需要新增元素dLinkedNode = new DLinkedNode(key, value);// 确保容量足够ensureCapacity(map.size() + 1);// 目前容量一定足够,直接插入到头部即可map.put(key, dLinkedNode);insertToHead(dLinkedNode);}}private void ensureCapacity(int newSize) {if (newSize <= capacity) {return;}// 如果容量不够,则需要删除最后的一个元素map.remove(tail.prev.key);delete(tail.prev);}
}
2.思路

使用双向链表+map来做

首先需要一个双向链表的类,key,value,next,prev即为属性

然后需要三个参数,双向链表的前后指针,map,容量

10.两两交换链表中的节点

1.答案
package com.sunxiansheng.arithmetic.day13;import com.sunxiansheng.arithmetic.util.ListNode;/*** Description: 24. 两两交换链表中的节点** @Author sun* @Create 2025/1/19 12:01* @Version 1.0*/
public class t24 {public ListNode swapPairs(ListNode head) {ListNode dummy = new ListNode(0);dummy.next = head;ListNode cur = dummy;// 提前记录prevListNode prev = dummy;// 循环翻转while (true) {// 先判断是否有一组for (int i = 0; i < 2; i++) {if (cur.next == null) {return dummy.next;}cur = cur.next;}// 到这里就是有一组了,开始翻转ListNode start = prev.next;ListNode then = start.next;reverse(prev, start, then);// 更新prev和curprev = start;cur = prev;}}// 两个一组翻转链表private void reverse(ListNode prev, ListNode start, ListNode then) {start.next = then.next;then.next = prev.next;prev.next = then;then = start.next;}
}
2.思路

就是两个一组翻转链表,翻转链表的次数是节点数减一,然后要提前记录prev,并且在翻转后更新prev和start

11.环形链表 II

1.答案
package com.sunxiansheng.arithmetic.day13;import com.sunxiansheng.arithmetic.util.ListNode;/*** Description: 142. 环形链表 II** @Author sun* @Create 2025/1/19 12:31* @Version 1.0*/
public class t142 {public ListNode detectCycle(ListNode head) {// 快慢指针ListNode slow = head;ListNode fast = head;while (fast != null && fast.next != null) {slow = slow.next;fast = fast.next.next;if (slow == fast) {// 这样只能代表有环,如果想要找到入环的第一个节点,就要让slow等于head,然后一起移动slow = head;while (slow != fast) {slow = slow.next;fast = fast.next;}return slow;}}return null;}
}
2.思路

发现有环之后,如果想要找到入环的第一个节点,就要让slow等于head,然后一起移动,直到相遇

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

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

相关文章

【Unity3D】3D物体摆放、场景优化案例Demo

目录 PlaceManager.cs(放置管理类) Ground.cs(地板类) 和 GroundData.cs(地板数据类) 额外知识点说明 1、MeshFilter和MeshRenderer的Bounds区别 2、Gizmos 绘制一个平行于斜面的立方体 通过网盘分享的文件&#xff1a;PlaceGameDemo2.unitypackage 链接: https://pan.baid…

C# OpenCvSharp 部署文档矫正,包括文档扭曲/模糊/阴影等情况

目录 说明 效果 模型 项目 代码 下载 参考 C# OpenCvSharp 部署文档矫正&#xff0c;包括文档扭曲/模糊/阴影等情况 说明 地址&#xff1a;https://github.com/RapidAI/RapidUnDistort 修正文档扭曲/模糊/阴影等情况&#xff0c;使用onnx模型简单轻量部署&#xff0c…

生成树机制实验

1 实验内容 1、基于已有代码,实现生成树运行机制,对于给定拓扑(four_node_ring.py),计算输出相应状态下的生成树拓扑 2、构造一个不少于7个节点,冗余链路不少于2条的拓扑,节点和端口的命名规则可参考four_node_ring.py,使用stp程序计算输出生成树拓扑 2 实验原理 一、…

数据结构详解——堆与二叉树

​ 目录 树的概念树的表示方法二叉树的概念特殊的二叉树二叉树的性质二叉树的存储结构顺序存储链式存储 堆的概念与结构堆的性质堆的实现堆的初始化入堆堆的扩容向上调整算法出堆&#xff08;最顶端元素&#xff09;向下调整算法 二叉树的实现二叉树的创建二叉树的销毁二叉树的…

【蓝桥杯】43694.正则问题

题目描述 考虑一种简单的正则表达式&#xff1a; 只由 x ( ) | 组成的正则表达式。 小明想求出这个正则表达式能接受的最长字符串的长度。 例如 ((xx|xxx)x|(x|xx))xx 能接受的最长字符串是&#xff1a; xxxxxx&#xff0c;长度是 6。 输入描述 一个由 x()| 组成的正则表达式。…

mac m1下载maven安装并配置环境变量

下载地址&#xff1a;Download Apache Maven – Maven 解压到一个没有中文和空格的文件夹 输入pwd查看安装路径 输入cd返回根目录再输入 code .zshrc 若显示 command not found: code你可以通过以下步骤来安装和配置 code 命令&#xff1a; 1. 确保你已经安装了 Visual Studio…

移远通信多模卫星通信模组BG95-S5获得Skylo网络认证,进一步拓展全球卫星物联网市场

近日&#xff0c;全球领先的物联网整体解决方案供应商移远通信正式宣布&#xff0c;其支持“卫星蜂窝”多模式的高集成度NTN卫星通信模组BG95-S5已成功获得NTN网络运营商Skylo的网络认证。BG95-S5也成为了获得该认证的最新款移远卫星通信模组。 BG95-S5模组顺利获得Skylo认证&a…

1.3.浅层神经网络

目录 1.3.浅层神经网络 1.3.1 浅层神经网络表示 1.3.2 单个样本的向量化表示 1.3.4 激活函数的选择 1.3.5 修改激活函数 1.3.5 练习​​​​​​​ 1.3.浅层神经网络 1.3.1 浅层神经网络表示 之前已经说过神经网络的结构了&#xff0c;在这不重复叙述。假设我们有如下…

StarRocks强大的实时数据分析

代码仓库&#xff1a;https://github.com/StarRocks/starrocks?tabreadme-ov-file StarRocks | A High-Performance Analytical Database 快速开始&#xff1a;StarRocks | StarRocks StarRocks 是一款高性能分析型数据仓库&#xff0c;使用向量化、MPP 架构、CBO、智能物化…

2024年博客之星主题创作|猫头虎分享AI技术洞察:2025年AI发展趋势前瞻与展望

2025年AI发展趋势前瞻&#xff1a;猫头虎深度解析未来科技与商业机遇 摘要 2024年&#xff0c;AI技术迎来爆发式增长&#xff0c;AIGC、智能体、AIRPA、AI搜索、推理模型等技术不断突破&#xff0c;AI应用场景持续扩展。2025年&#xff0c;AI将进入全新发展阶段&#xff0c;W…

51c~ONNX~合集1

我自己的原文哦~ https://blog.51cto.com/whaosoft/11608027 一、使用Pytorch进行简单的自定义图像分类 ~ONNX 推理 图像分类是计算机视觉中的一项基本任务&#xff0c;涉及训练模型将图像分类为预定义类别。本文中&#xff0c;我们将探讨如何使用 PyTorch 构建一个简单的自定…

每打开一个chrome页面都会【自动打开F12开发者模式】,原因是 使用HBuilderX会影响谷歌浏览器的浏览模式

打开 HBuilderX&#xff0c;点击 运行 -> 运行到浏览器 -> 设置web服务器 -> 添加chrome浏览器安装路径 chrome谷歌浏览器插件 B站视频下载助手插件&#xff1a; 参考地址&#xff1a;Chrome插件 - B站下载助手&#xff08;轻松下载bilibili哔哩哔哩视频&#xff09…

USB3020任意波形发生器4路16位同步模拟量输出卡1MS/s频率 阿尔泰科技

信息社会的发展&#xff0c;在很大程度上取决于信息与信号处理技术的先进性。数字信号处理技术的出现改变了信息 与信号处理技术的整个面貌&#xff0c;而数据采集作为数字信号处理的必不可少的前期工作在整个数字系统中起到关键 性、乃至决定性的作用&#xff0c;其应用已经深…

C++入门基础篇:域、C++的输入输出、缺省参数、函数重载、引用、inline、nullptr

本篇文章是对C学习前期的一些基础部分的学习分享&#xff0c;希望也能够对你有所帮助。 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 目录 1.第一个C程序 2. 域 3. namespace 3.1 namespace的作用 3.2 namespace的定义 3.3 namespace使用说明 4.C的输入和输出…

RabbitMQ---TTL与死信

&#xff08;一&#xff09;TTL 1.TTL概念 TTL又叫过期时间 RabbitMQ可以对队列和消息设置TTL&#xff0c;当消息到达过期时间还没有被消费时就会自动删除 注&#xff1a;这里我们说的对队列设置TTL,是对队列上的消息设置TTL并不是对队列本身&#xff0c;不是说队列过期时间…

ingress-nginx代理tcp使其能外部访问mysql

一、helm部署mysql主从复制 helm repo add bitnami https://charts.bitnami.com/bitnami helm repo updatehelm pull bitnami/mysql 解压后编辑values.yaml文件&#xff0c;修改如下&#xff08;storageclass已设置默认类&#xff09; 117 ## param architecture MySQL archit…

豪越科技消防一体化安全管控平台:推动消防作训模式智慧转型

在当今数字化浪潮席卷全球的时代背景下&#xff0c;各行业都在积极寻求创新与变革&#xff0c;以提升工作效率、优化管理流程。消防行业作为保障社会安全的关键领域&#xff0c;其数字化转型的需求尤为迫切。豪越科技的消防一体化安全管控平台应运而生&#xff0c;为消防工作带…

Tomcat下载配置

目录 Win下载安装 Mac下载安装配置 Win 下载 直接从官网下载https://tomcat.apache.org/download-10.cgi 在圈住的位置点击下载自己想要的版本 根据自己电脑下载64位或32位zip版本 安装 Tomcat是绿色版,直接解压到自己想放的位置即可 Mac 下载 官网 https://tomcat.ap…

【记录】腾讯混元大模型本地部署过程

概述 本文记录在本地部署腾讯混元大模型的过程。仅为部署记录,不涉及过多的技术要点。 混元大模型主页:https://github.com/Tencent/HunyuanVideo 该模型应该是当前开源的效果不错的模型,其实官方文档将部署过程写的相当详细了,但是这里为了便于后期的学习,特意将部署过程…

Go-知识 版本演进

Go-知识 版本演进 Go release notesr56(2011/03/16)r57(2011/05/03)Gofix 工具语言包工具小修订 r58(2011/06/29)语言包工具小修订 r59(2011/08/01)语言包工具 r60(2011/09/07)语言包工具 [go1 2012-03-28](https://golang.google.cn/doc/devel/release#go1)[go1.1 2013-05-13]…