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

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

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

(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)在相遇点,两个指针继续一个走一步,一个走两步,当再次相遇时,走一步的指针所走过的节点数记为环的长度。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值