快慢指针在腾讯面试题的应用
求链表的中间结点值(分奇偶结点个数情况)
(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)在相遇点,两个指针继续一个走一步,一个走两步,当再次相遇时,走一步的指针所走过的节点数记为环的长度。