快慢指针:链表题目的利器

[复制链接]
发表于 2025-11-9 09:00:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
快慢指针:链表题目的利器

1. 快慢指针的根本概念

快慢指针是一种双指针本领,通常用于办理链表题目。它利用两个指针,一个指针(慢指针)每次移动一步,另一个指针(快指针)每次移动两步。通过这种移动方式,快指针的移动速率是慢指针的两倍,因此快指针会先到达链表的末了。
2. 快慢指针的利用场景

2.1 探求链表的中心节点

这是快慢指针最常见的应用场景之一。通过快慢指针,可以轻松找到链表的中心节点。当快指针到达链表末了时,慢指针恰好位于链表的中心位置。
示例代码:
  1. ListNode *middleNode(ListNode *head) {
  2.     if (head == NULL || head->next == NULL) {
  3.         return head;
  4.     }
  5.     ListNode *fast = head, *slow = head;
  6.     while (fast->next != NULL && fast->next->next != NULL) {
  7.         slow = slow->next;
  8.         fast = fast->next->next;
  9.     }
  10.     if (fast->next != NULL) {
  11.         slow = slow->next;
  12.     }
  13.     return slow;
  14. }
复制代码
2.2 检测链表中的环

快慢指针也可以用于检测链表中是否存在环。假如链表中存在环,快指针和慢指针终极会在环内相遇。假如快指针到达链表末了,则链表中不存在环。
示例代码:
  1. bool hasCycle(ListNode *head) {
  2.     if (head == NULL || head->next == NULL) {
  3.         return false;
  4.     }
  5.     ListNode *fast = head, *slow = head;
  6.     while (fast->next != NULL && fast->next->next != NULL) {
  7.         slow = slow->next;
  8.         fast = fast->next->next;
  9.         if (slow == fast) {
  10.             return true;
  11.         }
  12.     }
  13.     return false;
  14. }
复制代码
2.3 探求环的入口

假如链表中存在环,快慢指针还可以用于找到环的入口。当快指针和慢指针在环内相遇后,将此中一个指针重置为链表头,然后两个指针每次各移动一步,它们再次相遇的位置即为环的入口。
示例代码:
  1. ListNode *detectCycle(ListNode *head) {
  2.     if (head == NULL || head->next == NULL) {
  3.         return NULL;
  4.     }
  5.     ListNode *fast = head, *slow = head;
  6.     while (fast->next != NULL && fast->next->next != NULL) {
  7.         slow = slow->next;
  8.         fast = fast->next->next;
  9.         if (slow == fast) {
  10.             break;
  11.         }
  12.     }
  13.     if (fast->next == NULL || fast->next->next == NULL) {
  14.         return NULL;
  15.     }
  16.     slow = head;
  17.     while (slow != fast) {
  18.         slow = slow->next;
  19.         fast = fast->next;
  20.     }
  21.     return slow;
  22. }
复制代码
2.4 探求链表的倒数第 k 个节点

快慢指针可以用于找到链表的倒数第 k 个节点。起首,将快指针向前移动 k 步,然后快慢指针同时移动,当快指针到达链表末了时,慢指针恰好位于倒数第 k 个节点。
示例代码:
  1. ListNode *findKthToLast(ListNode *head, int k) {
  2.     if (head == NULL) {
  3.         return NULL;
  4.     }
  5.     ListNode *fast = head, *slow = head;
  6.     for (int i = 0; i < k; i++) {
  7.         if (fast == NULL) {
  8.             return NULL;
  9.         }
  10.         fast = fast->next;
  11.     }
  12.     while (fast != NULL) {
  13.         slow = slow->next;
  14.         fast = fast->next;
  15.     }
  16.     return slow;
  17. }
复制代码
3. 快慢指针的优缺点

3.1 优点


  • 高效:快慢指针可以在一次遍历中完成多种任务,时间复杂度通常为 O(n)。
  • 轻便:代码实现轻便,易于明白和维护。
  • 实用广泛:实用于多种链表题目,如探求中心节点、检测环、找到环的入口等。
3.2 缺点


  • 界限条件复杂:必要过细处置处罚界限条件,如链表为空、链表长度为 1 等。
  • 指针操纵复杂:指针操纵容易堕落,特别是在处置处罚环和界限条件时。
4. 总结

快慢指针是一种非常实用的链表题目办理本领,通过公道利用快慢指针,可以高效地办理多种链表题目。把握快慢指针的利用方法和常见应用场景,将有助于你在算法口试和现实开发中更好地应对链表相干题目。渴望本文对你的学习和工作有所资助。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表