鍊錶演算法面試問題?看我就夠了!

2021-09-21 05:55:36 字數 3291 閱讀 3803

歡迎關注天善智慧型,我們是專注於商業智慧型bi,人工智慧ai,大資料分析與挖掘領域的垂直社群,學習,問答、求職一站式搞定!

1 引言

單鏈表的操作演算法是筆試面試中較為常見的題目。本文將著重介紹平時面試中常見的關於鍊錶的應用題目。

2 輸出單鏈表倒數第 k 個節點

2.1 問題描述

題目:輸入乙個單鏈表,輸出此煉表中的倒數第 k 個節點。(去除頭結點,節點計數從 1 開始)。

2.2 兩次遍曆法

2.2.1 解題思想

(1)遍歷單鏈表,遍歷同時得出鍊錶長度 n 。

(2)再次從頭遍歷,訪問至第 n - k 個節點為所求節點。

2.2.2 **過程

圖 12.2.3 **實現

/*計算鍊錶長度*/

intlistlength(listnode* phead)elseif(null== phead2)elseelseelseelseif(null== phead2)elseif(null==phead2)elseelseelseif(*phead == pdelnode)//刪除的節點是頭節點

deletepdelnode;

pdelnode=null;

*phead =null;

}else//刪除的是尾節點

listnode *pnode = *phead;

while(pnode->next != pdelnode) {

pnode = pnode->next;

pnode->next =null;

deletepdelnode;

pdelnode=null;

7 從尾到頭列印鍊錶

7.1 問題描述

輸入乙個鍊錶,按煉錶值從尾到頭的順序返回乙個 arraylist 。

7.2 解法

初看題目意思就是輸出的時候鍊錶尾部的元素放在前面,鍊錶頭部的元素放在後面。這不就是先進後出,後進先出麼。

什麼資料結構符合這個要求?

動畫 2

7.2.1 **實現

classsolution{

public:

vector printlistfromtailtohead(listnode* head) {

vector value;

listnode *p=null;

p=head;

stack stk;

while(p!=null){

stk.push(p->val);

p=p->next;

while(!stk.empty()){

value.push_back(stk.top());

stk.pop();

returnvalue;

7.3 解法二

第二種方法也比較容易想到,通過鍊錶的構造,如果將末尾的節點儲存之後,剩餘的煉表處理方式還是不變,所以可以使用遞迴的形式進行處理。

7.3.1 **實現

classsolution{

public:

vector value;

vector printlistfromtailtohead(listnode* head) {

listnode *p=null;

p=head;

if(p!=null){

if(p->next!=null){

printlistfromtailtohead(p->next);

value.push_back(p->val);

returnvalue;

8 反轉鍊錶

8.1 題目描述

反轉乙個單鏈表。

示例:

輸入:1->2->3->4->5->null

輸出:5->4->3->2->1->null

高階:

你可以迭代或遞迴地反轉鍊錶。你能否用兩種方法解決這道題?

8.2 解題思路

設定三個節點pre、cur、next

(1)每次檢視cur節點是否為null,如果是,則結束迴圈,獲得結果

(2)如果cur節點不是為null,則先設定臨時變數next為cur的下乙個節點

(3)讓cur的下乙個節點變成指向pre,而後pre移動cur,cur移動到next

(4)重複(1)(2)(3)

8.3 動畫演示

8.4 **實現

8.4.1 迭代方式

classsolution{

public:

listnode*reverselist(listnode* head){

listnode* pre =null;

listnode* cur = head;

while(cur !=null){

listnode* next = cur->next;

cur->next = pre;

pre = cur;

cur = next;

returnpre;

8.4.2 遞迴的方式處理

classsolution{

public:

listnode*reverselist(listnode* head){

// 遞迴終止條件

if(head ==null|| head->next ==null)

returnhead;

listnode* rhead = reverselist(head->next);

// head->next此刻指向head後面的鍊錶的尾節點

// head->next->next = head把head節點放在了尾部

head->next->next = head;

head->next =null;

returnrhead;

end今日問題:

通過本文的學習,以後遇到有關鍊錶的面試問題我們有哪些思路去解決?

感謝閱讀

推薦閱讀

1:網際網路公司迷信大全

2:爬一爬那些年你硬碟存過的老師

3:我男朋友是專案經理......

4:2023年python愛好者社群歷史文章合集(作者篇)

5:2023年終精心整理|python愛好者社群歷史文章合集(型別篇)

iOS面試屬性 property看我就夠了!!!

property ivar getter setter 屬性 property 作為 objective c 的一項特性,主要的作用就在於封裝物件中的資料。使用 property 系統會自動生成setter和getter方法 完成屬性定義後,編譯器會自動編寫訪問這些屬性所需的方法,此過程叫做 自動合...

演算法學習(一)面試問題

對一組資料進行排序 可以用快速排序o nlogn 但是只能證明會快排,但忽略了使用環境。1 所以可以和面試官 1 這組資料有什麼樣的特徵,比如是否包含大量重複元素,如果有那麼三路排序更好,如果所有的排序都是獨特的那普通的就好了。很多語言的標準庫都是三路快排 2 是否大部分資料距離他的正確位置很近?是...

決策樹演算法面試問題彙總

自己救自己系列,不然要沒工作了,我太難了。紅色加粗是我見了好多次,感覺經常會考得點。感覺決策樹是很常考的內容,所以一定要注意!1 id3 的構造準則是資訊增益 2 c4.5的構造準則是資訊增益比 3 cart classfication and regression tree,分類與回歸樹 分類問題...