快慢指针在腾讯面试题的应用

快慢指针在腾讯面试题的应用

求链表的中间结点值(分奇偶结点个数情况)

(1)mid与search(搜寻指针,快指针)
(2)search是mind移动速度的2倍 (标尺的思想)

#include <iostream>

using namespace std;

//增强代码的可读性,状态值设置为Status
typedef int Status;
typedef double ElemType;

//Status状态中OK为1,ERROR为0
#define OK 1
#define ERROR 0

/**
 * 节点的声明
 */
typedef struct node {
    //数据data
    double data;
    struct node* next;
}LinkList;

/**
 * 获得中间结点,将其值赋予e
 * @param L 单向链表
 * @param e 存储器(存储中间结点值)
 * @return 状态值
 */
Status getMidNode(LinkList* L, ElemType* e) {
    //赋初值都指向开头
    LinkList* mid, *search;
    mid = search = L;
    
    //开始遍历至最后一个结点
    while(search->next != NULL) {
        //色arch是mid速度的两倍
        //跳两次是空
        if(search->next->next != NULL) {
            search = search->next->next;
            mid = mid->next;
        } else {
            search = search->next;
        }
        
    }//of search->next
    
    *e = mid->data;//此时search为最后一个结点,mid为中间结点
    return OK;//结束
}

拓展:判断单向链表是否有环?

(1)用两个指针指向链表头,每次循环,快指针往前两步,慢指针往前一步;
(2)在循环过程中,如果快指针等于慢指针(相遇),则表示链表有环;否则不存在环。

如何计算环的长度?

(1)在相遇点,两个指针继续一个走一步,一个走两步,当再次相遇时,走一步的指针所走过的节点数记为环的长度。

发布了47 篇原创文章 · 获赞 18 · 访问量 4856

猜你喜欢

转载自blog.csdn.net/qq_43605085/article/details/103047028