【基础算法】快慢双指针

举报
一颗小谷粒 发表于 2024/10/29 21:26:38 2024/10/29
【摘要】 链表相关问题判断链表是否有环应用场景:在处理链表数据结构时,例如在垃圾回收算法(检测引用是否形成循环)、资源管理(避免循环依赖)等场景中,需要判断链表是否存在环。实现原理:使用快慢双指针同时从链表头开始遍历。快指针每次移动两步,慢指针每次移动一步。如果链表有环,快指针最终会追上慢指针;如果快指针先到达链表末尾(null),则说明链表无环。示例代码(以 Java 为例):class ListN...
  1. 链表相关问题
    • 判断链表是否有环
      • 应用场景:在处理链表数据结构时,例如在垃圾回收算法(检测引用是否形成循环)、资源管理(避免循环依赖)等场景中,需要判断链表是否存在环。
      • 实现原理:使用快慢双指针同时从链表头开始遍历。快指针每次移动两步,慢指针每次移动一步。如果链表有环,快指针最终会追上慢指针;如果快指针先到达链表末尾(null),则说明链表无环。
      • 示例代码(以 Java 为例):
    • class ListNode {
          int val;
          ListNode next;
          ListNode(int val) {
              this.val = val;
          }
      }
      public class LinkedListCycleDetection {
          public boolean hasCycle(ListNode head) {
              if (head == null) {
                  return false;
              }
              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;
          }
      }
      • 寻找链表中环的入口节点
        • 应用场景:在发现链表有环后,进一步确定环的起始位置,这在分析循环数据结构的起点或者循环依赖的根源时很有用。
        • 实现原理:当快慢指针相遇后,将慢指针重新指向链表头,然后快慢指针同时以相同速度移动,再次相遇的节点就是环的入口节点。
        • 示例代码(以 Java 为例):
        • class ListNode {
              int val;
              ListNode next;
              ListNode(int val) {
                  this.val = val;
              }
          }
          public class LinkedListCycleEntry {
              public ListNode detectCycle(ListNode head) {
                  if (head == null) {
                      return null;
                  }
                  ListNode slow = head;
                  ListNode fast = head;
                  boolean hasCycle = false;
                  while (fast!= null && fast.next!= null) {
                      slow = slow.next;
                      fast = fast.next.next;
                      if (slow == fast) {
                          hasCycle = true;
                          break;
                      }
                  }
                  if (!hasCycle) {
                      return null;
                  }
                  slow = head;
                  while (slow!= fast) {
                      slow = slow.next;
                      fast = fast.next;
                  }
                  return slow;
              }
          }
          • 寻找链表的中间节点
            • 应用场景:在对链表进行分割、归并排序或者在一些需要平衡处理链表两侧节点的算法中,找到链表的中间节点很重要。
            • 实现原理:快指针每次移动两步,慢指针每次移动一步。当快指针到达链表末尾时,慢指针正好在链表的中间位置。
            • 示例代码(以 Java 为例):
class ListNode {
    int val;
    ListNode next;
    ListNode(int val) {
        this.val = val;
    }
}
public class LinkedListMiddleNode {
    public ListNode middleNode(ListNode head) {
        ListNode slow = head;
        ListNode fast = head;
        while (fast!= null && fast.next!= null) {
            slow = slow.next;
            fast = fast.next.next;
        }
        return slow;
    }
}
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。