首页 > 其他分享 >快慢指针-牛客题霸模板速刷(BM6、BM7、BM8)

快慢指针-牛客题霸模板速刷(BM6、BM7、BM8)

时间:2023-01-29 12:14:14浏览次数:47  
标签:结点 slow ListNode 速刷 fast next BM6 BM7 指针

快慢指针是指在链表或其他遍历对象中,通过两个相同方向的指针,即快指针和慢指针,以不同的速度遍历,从而实现寻找某个结点的目的。

BM6-判断链表中是否有环

题解:想象在环形跑道上两个运动员从同一起点出发以不同的速度向前奔跑,则到某一时刻两人一定会到达同一点。快慢指针同理,使快指针每次前移两个结点,慢指针每次前移一个结点,若链表中存在环,则之后快慢指针一定会指向同一结点。

class Solution {
public:
    bool hasCycle(ListNode *head) {
        if(head == NULL)
            return false;
        ListNode* fast = head;
        ListNode* slow = head;
        while(fast != NULL && fast->next != NULL){
            fast = fast->next->next;
            slow = slow->next;
            if(fast == slow)
                return true;
        }
        return false;
    }
};

 

BM7-链表中环的入口结点

题解:使快慢指针以不同的速度前移,找到相遇的结点。而后让快指针指向头结点,让两个指针以相同的速度前移,两指针相遇的结点即为链表中环的入口结点。

class Solution {
  public:
    ListNode* hasCycle(ListNode* head) { 
        if (head == NULL)
            return NULL;
        ListNode* fast = head;
        ListNode* slow = head;
        while (fast != NULL && fast->next != NULL) { 
            fast = fast->next->next;
            slow = slow->next;
            if (fast == slow)
                return slow;
        }
        return NULL;
    }
    ListNode* EntryNodeOfLoop(ListNode* pHead) {
        ListNode* slow = hasCycle(pHead);
        if (slow == NULL)
            return NULL;
        ListNode* fast = pHead;
        while (fast != slow) {
            fast = fast->next;
            slow = slow->next;
        }
        return slow;
    }
};

 

BM8-链表中倒数最后k个结点

题解:开始时快慢指针同时指向头结点,先让快指针向前移动k个结点,再让慢指针和快指针以同样的速度前移,当快指针到达链表尾端时,慢指针前移了n-k个结点,即指向了链表中倒数第k个结点

class Solution {
public:
    ListNode* FindKthToTail(ListNode* pHead, int k) {
        ListNode* fast = pHead;
        ListNode* slow = pHead;
        for(int i = 0; i < k; i++){
            if(fast != NULL)
                fast = fast->next;
            else
                return slow = NULL;
        }
        while(fast != NULL){
            fast = fast->next;
            slow = slow->next;
        }
        return slow;
    }
};

 

标签:结点,slow,ListNode,速刷,fast,next,BM6,BM7,指针
From: https://www.cnblogs.com/LiXinjuan/p/17072319.html

相关文章

  • BM7 链表中环的入口结点
    题目描述思路分析做这道题我第一反应是用“记事本”,也就是将遍历过的节点存储起来,如果下次再遍历到这个节点,那么也就是环的入口节点。遍历节点,如果是遍历过的,那么就直接......
  • 牛客BM76(正则表达式匹配)
    BM76正则表达式匹配具体实现:1.确定dp数组以及下标的含义dp[i][j]代表s中以i结尾的子串和p中j为结尾的子串是否匹配2.状态转移(1)p[j]为普通字符:匹配的条件是前面的字符......
  • c++知识点速刷
    语法指针和引用指针:存放某个对象的地址引用:变量的别名,从一而终,不可变,必须初始化const变量指针常量(底层const):指针所指的对象不可变常量指针(顶层const):指针不可变defin......