【數(shù)據(jù)結(jié)構(gòu)】線性表之單鏈表小結(jié)練習(xí)(快速找到未知長度單鏈表的中間節(jié)點(diǎn))

面試題一般會(huì)有普通方法和高級(jí)方法,高級(jí)方法無疑會(huì)大大的加分!


題目一:快速找到未知長度單鏈表的中間節(jié)點(diǎn)(騰訊面試題

普通解法
  • 思路
    首先遍歷一遍單鏈表以確定單鏈表的長度。然后再次從頭結(jié)點(diǎn)出發(fā)循環(huán)L/2次找到單鏈表的中間節(jié)點(diǎn)。
    算法復(fù)雜度為:O(L+L/2) = O(3L/2)
高級(jí)解法
  • 思路
    利用快慢指針原理:設(shè)置兩個(gè)指針*search*mid都指向單鏈表的頭節(jié)點(diǎn)。其中*search的移動(dòng)速度是*mid的2倍。當(dāng)*search指向結(jié)尾節(jié)點(diǎn)的時(shí)候,mid正好在中間了。這也是標(biāo)尺的思想。
  • 代碼實(shí)現(xiàn)
#include <stdio.h>

#define OK 1;
#define ERROR 0;
#define TRUE 1;
#define FALSE 0;
#define MAXSIZE 20  /* 定義線性表可能達(dá)到的最大長度 */

typedef int  ElemType;
typedef struct {

    ElemType data[MAXSIZE];
    int length;
    
}SqList;


typedef int  Status;

// 單鏈表
typedef struct Node{
    
    ElemType data; // 數(shù)據(jù)域
    struct Node * next; // 指針域
    
}Node;

// 取別名
typedef struct Node * LinkList;

/**
 * 用快慢指針快速找到未知長度單鏈表的中間節(jié)點(diǎn)
 */
Status GetMidNode(LinkList L, ElemType * e){
    
    LinkList search, mid;
    
    mid = search = L;
    
    while (search->next != NULL) {
        
        //search的速度是mid的兩倍
        if (search->next->next != NULL) {
            
            search = search->next->next;
            mid = mid->next;
        }else{
            
            search = search->next;
        }
    }
    
    // 中間節(jié)點(diǎn)
    *e = mid->data;
    
    return OK;
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容