news 2026/4/15 17:11:35

如何在链表中使用双指针技术

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何在链表中使用双指针技术

题目:给定一个链表,删除倒数第n个结点。如 1->2->3->4->5->null,n=2,返回 1->2->3->5->null。

需要明确的地方:n从0计还是从1计?n不合法,负数或者大于连标长度如何处理(保证n合法)。

思路1:先遍历一遍计算链表长度,再遍历一遍删除第length-n+1个结点。

思路2:能不能只遍历一遍链表就解决问题呢?首先添加一个虚拟结点,找到要删除结点的前驱。使用双指针,也就是快慢指针。

公用代码:

​ public class ListNode { public int val; public ListNode next; public ListNode(int x) { this.val = x; this.next = null; } public static ListNode createList(int[] nums) { if(null == nums || 0 == nums.length) return null; ListNode head = new ListNode(nums[0]); ListNode needle = head; for(int i = 1; i < nums.length;++i) { ListNode node = new ListNode(nums[i]); needle.next = node; needle = needle.next; needle.next = null; } return head; } }
public ListNode removeNthFromEnd(ListNode head, int n) { if (n < 0) return null; // 创建虚拟头指针 ListNode dummyHead = new ListNode(-1); dummyHead.next = head; ListNode pre = dummyHead; ListNode fast = dummyHead.next; // 快指针先走n步 for (int i = 0; i < n; i++) { if (fast != null) fast = fast.next; } // 快慢指针一同前行,但是这里要对快指针进行判断哦 while (fast != null) { pre = pre.next; fast = fast.next; } // 此时fast指向null,而pre就指向要删除结点的前驱 ListNode delNode = pre.next; pre.next = delNode.next; return dummyHead.next; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/14 1:06:37

【机器人路径规划】基于6种算法(黑翅鸢优化算法BKA、SSA、MSA、RTH、TROA、COA)求解机器人路径规划研究附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f34a;个人信条&#xff1a;格物致知,完整Matlab代码及仿真咨询…

作者头像 李华
网站建设 2026/4/14 22:58:08

华为OD机试 B卷 - 稀疏矩阵扫描 (C++ Python JAVA JS GO)

稀疏矩阵扫描 华为OD机试B卷 - 华为OD上机考试B卷 100分题型 华为OD机试真题目录点击查看: 华为OD机试真题题库目录&#xff5c;机考题库 算法考点详解 题目描述 如果矩阵中的许多系数都为零&#xff0c;那么该矩阵就是稀疏的。对稀疏现象有兴趣是因为它的开发可以带来巨大…

作者头像 李华
网站建设 2026/4/15 23:48:02

Go Module构建

添加依赖包 在Go Module项目中添加新依赖包&#xff0c;可以通过修改源码并执行相关命令完成。以添加github.com/google/uuid为例&#xff1a; package mainimport ("github.com/google/uuid""github.com/sirupsen/logrus" )func main() {logrus.Println(&…

作者头像 李华
网站建设 2026/4/15 17:01:21

Python类入门:用“汽车工厂”理解面向对象编程

引言&#xff1a;为什么需要“类”&#xff1f; 想象你是一家汽车工厂的工程师&#xff0c;每天要生产不同型号的汽车。如果每生产一辆车都要重新设计图纸、组装零件&#xff0c;效率会非常低。聪明的做法是&#xff1a;先设计一个“汽车模板”&#xff08;类&#xff09;&…

作者头像 李华