快慢指針在騰訊面試題的應用
求鏈表的中間結點值(分奇偶結點個數情況)
(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)在相遇點,兩個指針繼續一個走一步,一個走兩步,當再次相遇時,走一步的指針所走過的節點數記爲環的長度。