news 2026/5/8 21:26:56

链表 双指针

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
链表 双指针

1. 快慢指针(起点不一致)

起点不一致的快慢指针:快指针先走 n 步,然后两个指针同时移动,快指针到达末尾时,慢指针正好在目标位置。

  1. 初始化:两个指针 slow、fast 都指向头节点。
  2. 快指针先行:快指针先移动 n 步。
  3. 同步移动:两个指针同时移动,直到快指针到达末尾(fast == Null)。
  4. 结果:慢指针正好指向倒数第 n 个节点

模板:

def findNthFromEnd(head, n): slow = fast = head # 快指针先走 n 步 for _ in range(n): fast = fast.next # 两个指针同时移动 while fast: slow = slow.next fast = fast.next return slow # 慢指针指向倒数第 n 个节点

例题:19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode)

注意:链表删除节点 → 一律用 dummy 虚拟头节点这样永远不会空指针,永远能删头节点!

给你一个链表,删除链表的倒数第n个结点,并且返回链表的头结点。

示例 1:

输入:head = [1,2,3,4,5], n = 2输出:[1,2,3,5]
/** * Definition for singly-linked list. * public class ListNode { * public int val; * public ListNode next; * public ListNode(int val=0, ListNode next=null) { * this.val = val; * this.next = next; * } * } */ public class Solution { public ListNode RemoveNthFromEnd(ListNode head, int n) { ListNode dummyHead = new ListNode(); dummyHead.next = head; ListNode fast = dummyHead; ListNode slow = dummyHead; for(int i=0;i<n;i++) { fast = fast.next; } while(fast.next!=null) { fast=fast.next; slow = slow.next; } slow.next = slow.next.next; return dummyHead.next; } }

2. 快慢指针(步长不一致)

步长不一致的快慢指针:两个指针从同一起点出发,慢指针每次走 1 步,快指针每次走 2 步。

  1. 初始化:两个指针都指向头节点。
  2. 不同步长:慢指针每次移动 1 步,快指针每次移动 2 步。
  3. 终止条件:快指针到达末尾或无法继续移动。
  4. 应用场景:找中点、检测环、找交点等。

模板:

def fastSlowPointer(head): slow = fast = head # 快指针每次走 2 步,慢指针每次走 1 步 while fast and fast.next: slow = slow.next # 慢指针移动 1 步 fast = fast.next.next # 快指针移动 2 步 return slow # 慢指针指向中点或环的入口



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

给你单链表的头结点head,请你找出并返回链表的中间结点。

如果有两个中间结点,则返回第二个中间结点。

示例 1:

输入:head = [1,2,3,4,5]输出:[3,4,5]解释:链表只有一个中间结点,值为 3 。

示例 2:

输入:head = [1,2,3,4,5,6]输出:[4,5,6]解释:该链表有两个中间结点,值分别为 3 和 4 ,返回第二个结点。
/** * Definition for singly-linked list. * public class ListNode { * public int val; * public ListNode next; * public ListNode(int val=0, ListNode next=null) { * this.val = val; * this.next = next; * } * } */ public class Solution { 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. 分离双指针

分离双指针:两个指针分别在不同的链表中移动,常用于合并、比较等操作。

  1. 初始化:两个指针分别指向两个链表的头节点。
  2. 条件移动:根据具体问题决定何时移动哪个指针。
  3. 终止条件:其中一个链表遍历完毕或满足特定条件。
  4. 应用场景:有序链表合并、链表比较等。

模板:

def separateTwoPointers(list1, list2): p1, p2 = list1, list2 while p1 and p2: if condition1: # 两个指针同时移动 p1 = p1.next p2 = p2.next elif condition2: # 只移动第一个指针 p1 = p1.next else: # 只移动第二个指针 p2 = p2.next return result


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

将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

示例 1:

输入:l1 = [1,2,4], l2 = [1,3,4]输出:[1,1,2,3,4,4]
/** * Definition for singly-linked list. * public class ListNode { * public int val; * public ListNode next; * public ListNode(int val=0, ListNode next=null) { * this.val = val; * this.next = next; * } * } */ public class Solution { public ListNode MergeTwoLists(ListNode list1, ListNode list2) { ListNode dummyHead = new ListNode(); ListNode current = dummyHead; while(list1!=null&&list2!=null) { if(list1.val<=list2.val) { current.next =list1; list1 = list1.next; } else { current.next = list2; list2 = list2.next; } current = current.next; } if(list2!=null) { current.next = list2; } else { current.next =list1; } return dummyHead.next; } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/8 21:26:37

shellChatGPT:终端AI助手配置与实战指南

1. 项目概述&#xff1a;一个为终端而生的全能AI助手 如果你和我一样&#xff0c;是个常年泡在终端里的开发者、运维或者技术爱好者&#xff0c;那你肯定有过这样的体验&#xff1a;想快速问AI一个问题&#xff0c;或者让它帮你写段脚本&#xff0c;结果不得不离开心爱的命令行…

作者头像 李华
网站建设 2026/5/8 21:26:36

数据生成工具DATAGEN:从原理到实践,构建高质量测试数据

1. 项目概述&#xff1a;数据生成工具的深度解构最近在数据工程和机器学习社区里&#xff0c;一个名为“DATAGEN”的项目引起了我的注意。这个由starpig1129维护的开源工具&#xff0c;名字直白地指向了“数据生成”这个核心功能。在当今这个数据驱动的时代&#xff0c;无论是算…

作者头像 李华
网站建设 2026/5/8 21:19:32

高中化学资源合集(第三辑)

洋葱学院高中化学-人教版 文件大小: -内容特色: 人教版高中化学同步动画精讲&#xff0c;覆盖必修选修适用人群: 高一至高三学生及化学教师核心价值: 5分钟短视频拆解重难点&#xff0c;提分立竿见影下载链接: https://pan.quark.cn/s/87865ac82540 初高中化学火花学院&#…

作者头像 李华
网站建设 2026/5/8 21:09:49

Prompt工程实战:六大技巧提升AI指令效果,从模糊需求到精准输出

1. 从“会議の議事録を作ってください”到“要点を整理した議事録を作成してください”&#xff1a;Prompt工程的本质是信息增补如果你用过ChatGPT、Copilot或者任何一款大语言模型&#xff0c;大概率都经历过这样的挫败感&#xff1a;你满怀期待地输入一个指令&#xff0c;得到…

作者头像 李华
网站建设 2026/5/8 21:09:48

AlphaPy Pro:从Pipeline设计到实战的机器学习框架演进与量化应用

1. 项目概述&#xff1a;从AlphaPy到AlphaPy Pro的机器学习框架演进如果你在金融量化或者体育预测的圈子里混过一段时间&#xff0c;大概率听说过或者尝试过用机器学习模型来“猜”市场走势或比赛结果。这事儿听起来很酷&#xff0c;但真上手了就会发现&#xff0c;从数据清洗、…

作者头像 李华
网站建设 2026/5/8 21:09:00

别再复制粘贴了!程序员必备的Unicode汉字符号速查表(含一键复制)

程序员必备的Unicode汉字符号高效输入指南 1. 为什么需要掌握Unicode汉字符号&#xff1f; 在日常开发工作中&#xff0c;我们经常需要在代码注释、文档说明或UI界面中添加一些特殊符号来增强表达效果。比如用箭头符号表示流程走向&#xff0c;用数学符号展示公式逻辑&#xff…

作者头像 李华