• 快慢指针思想(Hare & Tortoise 算法)


    目录​​​​​​​

    一、快慢指针概念

    二、常用场景

     2.1 寻找倒数第k个节点

    2.2 判断回文链表

    2.3 用于判断链表中是否存在 “环”  

    2.4 用于判断存在“环”的链表中,“环”的起始位置


    一、快慢指针概念

            快慢指针是一种常用的数据结构思想,主要用于解决链表中的问题。

            该算法会使用两个移动速度不同的指针,一个快指针和一个慢指针。


    二、常用场景

     2.1 寻找倒数第k个节点

     主要逻辑:

    • 假设寻找倒数第k个节点,
    • 快指针先走k步,
    • 然后快慢指针一起走,
    • 当快指针走到null时,慢指针就指向要找的那个节点。

    代码实现: 

    1. public ListNode FindKthToTail (ListNode pHead, int k) {
    2. ListNode fast = pHead;
    3. while(k > 0){
    4. if(fast == null){ //处理k值大于链表长度的问题;
    5. return null;
    6. }
    7. fast = fast.next;
    8. k--;
    9. }
    10. ListNode slow = pHead;
    11. while(fast != null){
    12. fast = fast.next;
    13. slow = slow.next;
    14. }
    15. return slow;
    16. }

    2.2 判断回文链表

     主要逻辑:

    • 使用快指针找到链表的中间节点,
    • 逆序后半部分节点,
    • 快慢指针一起移动,并在移动时对比各自指向的元素是否内容一致。

    代码实现:

    1. public class ListNode {
    2. int val;
    3. ListNode next = null;
    4. public ListNode(int val) {
    5. this.val = val;
    6. }
    7. }
    8. public boolean isPail (ListNode head) {
    9. if (head == null) {
    10. return true;
    11. }
    12. //设置快慢两个指针;
    13. ListNode fast = head;
    14. ListNode slow = head;
    15. while(fast != null && fast.next != null){
    16. fast = fast.next.next;
    17. slow = slow.next;
    18. } //走完这个循环,slow指向中间节点;
    19. fast = head; //重新获得头节点;
    20. slow = reverse(slow); //逆序链表后半段;
    21. //两个指针同时走,直到slow为空;
    22. while(slow != null){
    23. //出现值不同,则直接返回false
    24. if(fast.val != slow.val){
    25. return false;
    26. }
    27. fast = fast.next;
    28. slow = slow.next;
    29. }
    30. return true;
    31. }
    32. private ListNode reverse(ListNode cur) {
    33. ListNode prev = null;
    34. while(cur != null){
    35. ListNode curNext = cur.next;
    36. cur.next = prev;
    37. prev = cur;
    38. cur = curNext;
    39. }
    40. return prev;
    41. }

    2.3 用于判断链表中是否存在 “环”  

    主要逻辑:

    • 快指针每次移动两个节点,慢指针每次移动一个节点,
    • 当快慢两个指针相遇时,则表示存在环,
    • 当快指针指向null,或快指针的下一节点指向null时,则不存在环。

    代码实现: 

    1. public boolean hasCycle(ListNode head) {
    2. if(head == null){
    3. return false;
    4. }
    5. ListNode fast = head;
    6. ListNode slow = head;
    7. while(fast != null && fast.next != null){
    8. slow = slow.next;
    9. fast = fast.next.next;
    10. if(fast == slow){
    11. return true;
    12. }
    13. }
    14. return false;
    15. }

    2.4 用于判断环形链表中,“环”的起始位置

    主要逻辑:

    • 快指针每次移动两个节点,慢指针每次移动一个节点,
    • 当快慢两个指针相遇时,将其中一个指针重置为链表的头节点,
    • 两个指针同时每次移动一个节点,
    • 当两个节点相遇时,相遇的位置就是环的起始位置。

    代码实现: 

    1. public ListNode detectCycle(ListNode head) {
    2. if (head == null) {
    3. return null;
    4. }
    5. ListNode fast = head;
    6. ListNode slow = head;
    7. while(fast != null && fast.next != null){
    8. fast = fast.next.next;
    9. slow = slow.next;
    10. if(fast == slow){
    11. slow = head;
    12. while(true){
    13. if(fast == slow){
    14. return fast;
    15. }
    16. fast = fast.next;
    17. slow = slow.next;
    18. }
    19. }
    20. }
    21. return null;
    22. }

    ( 哈哈哈~~ 文章结束!) 

    ( 看到这里,如果有为各位帅哥美女提供一点点灵感,请点一个小小的赞哦,比心💖💖💖 )

  • 相关阅读:
    面试: Hashtable vs ConcurrentHashMap
    日志(三)
    【开题报告】基于Spring Boot的课程在线预约系统的设计与实现
    TinyOs操作系统---第6章 存储管理与应用
    Sequential模型、Flatten层、Dense层
    初识OpenGL (-)纹理(Texture)
    Windows服务器监控工具
    城商行数据仓库数据测试总结:方法、流程、策略和常见问题
    (经验贴)怎么对HTML文件进行分析
    Java多线程之线程同步(解决线程安全问题)
  • 原文地址:https://blog.csdn.net/zzy734437202/article/details/134045552