快慢指針在騰訊面試題的應用

快慢指針在騰訊面試題的應用

求鏈表的中間結點值(分奇偶結點個數情況)

(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)在相遇點,兩個指針繼續一個走一步,一個走兩步,當再次相遇時,走一步的指針所走過的節點數記爲環的長度。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章