鍊錶的面試題總結

2021-08-13 19:41:45 字數 3500 閱讀 2143

鍊錶的面試題總結

鍊錶在面試中是非常容易的考點,所以在這裡總結一下,希望對大家有所幫助

首先,我們給出鍊錶的基本結構,和基本的操作,建立乙個結點,列印鍊錶的結點,尾插法加入結點。

#include #include #include typedef int datatype;

typedef struct slistnodeslistnode;

slistnode* buyslistnode(datatype x); //

void slistprint(slistnode* phead); //

void slistpushback(slistnode** pphead, datatype x);

slistnode* buyslistnode(datatype x)

void slistprint(slistnode* phead)

else

printf("\n"); }}

void slistpushback(slistnode** pphead, datatype x)

else

pcur->_pnext = newnode; }}

int main()

此時我們就建立好乙個鍊錶,鍊錶的內容為:1 2 3 4 5 

①從尾到頭列印鍊錶

方法中我們定義乙個tail指標,每次把tail指標當作結尾的標緻向前移動,然後遍歷鍊錶列印尾結點

void printlisttailtohead(slistnode* phead)

printf("%d ",cur->_pdata);

tail = cur;

}}

②刪除無頭單鏈表的非尾結點(不能遍歷)

我們使用替換法刪除結點,用next指標標記pos的下乙個結點,用next->data覆蓋pos->data,然後把next釋放,邏輯上pos指的結點就被刪除了

slistnode* find(slistnode* phead,datatype x)

return null;

}void deletenottailnode(slistnode* pos)

③在無頭單鏈表的乙個結點前插入乙個結點(不能遍歷)

方法和之前的替換法相當,用後插法在結點的後面插入乙個值,用要插入的值改變pos的值,那麼在邏輯上就是在pos前面插入乙個值

void insertfrontnode(slistnode* pos,datatype x)
④約瑟夫環問題

每次按照傳入的引數,讓cur走相應的步數,然後按照替換法刪除在邏輯上刪除cur指的結點

slistnode* josephcircle(slistnode* phead,int k)

next = cur->_pnext;

cur->_pdata = next->_pdata;

cur->_pnext = next->_pnext;

free(next);

} return cur;

}

⑤單鏈表的逆置(不開闢新空間)

方法一:

函式中,我們用n1,n2,n3三個指標聯動跑,按照while迴圈裡面的順序,最後一次出來的時候n2,n3指的是空,n1指的是之前鍊錶的尾部,現在返回n1就是返回新鍊錶的頭指標

slistnode* reverselist(slistnode** pphead)

} return n1;

}

方法二:

slistnode* reverselist(slistnode** pphead)

return newlist;

}

⑥鍊錶的氣泡排序

void slistbubblesort(slistnode* phead)

cur = cur->_pnext;

next = next->_pnext;

} if(flag == 0)

tail = cur;

}}

⑦把兩個鍊錶合成乙個有序鍊錶

注意情況:兩個鍊錶有可能不一樣長,有可能為空

slistnode* slistmeget(slistnode** list1,slistnode** list2)

if((*list1)->_pdata < (*list2)->_pdata)

while (*list1 && *list2)//兩個鍊錶都沒結束的時候,做比較,把新鍊錶的tail->_pnext指向較小的鍊錶

else

tail = tail->_pnext;

} if(*list1)

if(*list2)

return list;

}

⑧找到鍊錶的中間鍊錶(只能遍歷一遍鍊錶)

函式中,使用乙個快指標fast,使用乙個慢指標slow,slow走一步,fast走兩步,那麼在fast走到結尾的時候,slow走了fast的一半,所以slow就走在鍊錶的中間

slistnode* findmidnode(slistnode* phead)

return slow;

}

⑨找到倒數第k個結點(只能遍歷一次鍊錶)

方法中首先讓快指標和慢指標相差k個位置,那麼在快指標到達尾結點的時候,慢指標就在倒數第k個結點

slistnode* findnodefrombackofnumberk(slistnode* phead,int k)

} while (fast)

return slow;

}

⑩判斷鍊錶是否帶環

fast指標一次走兩步,slow指標一次走一步,若帶環,那麼兩個指標在環裡面一定會相遇

slistnode* iscircle(slistnode* phead)
}return null;}

⑪判斷環的大小,也就是環裡面有多少結點

我們使用之前判斷是否帶環的函式來確定指標在環裡面相遇的點,在按照這個點跑一圈,就是這個環的長度。

int circlelength(slistnode* phead)

return cnt;

}

⑫判斷環的入口點:

slistnode* enternode(slistnode* phead)

return cur;

}

判斷環的入口點講解圖:

面試題總結 鍊錶型別

單向鍊錶的定義如下 struct listnode 往該鍊錶的末尾新增乙個結點的c 如下 listnode addtail listnode phead,int value pnode m pnext pnew return phead 在鍊錶中找到第乙個含有某值的結點並刪除該結點 void rem...

鍊錶的演算法面試題總結

1 單鏈表的建立和遍歷 2 求單鏈表中節點的個數 太簡單,就不寫了 3 查詢單鏈表中的倒數第k個結點 劍指offer,題15 4 查詢單鏈表中的中間結點 5 合併兩個有序的單鏈表,合併之後的鍊錶依然有序 出現頻率高 劍指offer,題17 6 單鏈表的反轉 出現頻率最高 劍指offer,題16 7 ...

鍊錶的面試題

1 比較順序表和煉表的優缺點,它們分別在什麼場景下使用?1 順序表支援隨機訪問,單鏈表不支援隨機訪問。2 順序表插入 刪除資料效率很低,時間複雜度為o n 除尾插和尾刪 單鏈表插入 刪除效率更高,時間複雜度為o 1 3 順序表的cpu高速緩衝效率更高,單鏈表cpu高速緩衝效率低。2 列印單向鍊錶 v...