offer 鍊錶反轉和從尾到頭列印鍊錶

2022-03-18 16:24:55 字數 1920 閱讀 5791

這個是高頻的面試題,今天總結了一些。反轉鍊錶用三個指標實現,返回新鍊錶的頭節點;而從尾到頭列印,應用棧實現,返回vector整個鍊錶。

//

題目描述

////

輸入乙個鍊錶,反轉鍊錶後,輸出鍊錶的所有元素。

struct

listnode

};//

思路//

在反轉鍊錶的時候,我們很容易想到讓當前結點的next指向前乙個結點,

//但是這樣做了之後這個節點原本next所指的結點就找不回了,所以每次我們都要儲存新的前一結點,

//當前結點和下一結點三個指標,只要下一結點為空,那麼我們就到了原本結點的尾部,這時正是新鍊錶的頭部

class

solution

while (current != nullptr) //

當前結點不為空

current->next = pre; //

當前結點的後繼轉為前驅

pre = current; //

前驅轉為當前結點

current = pnext; //

當前結點向後移

}

return

pnewnode;

}};//

1、三個指標在鍊錶上同時滑動,比較容易想到但是編碼略複雜

class

solution

p->next = pbefore; //

完成最後乙個結點的前驅

phead->next = nullptr; //

尾結點後繼為空

return

p; }

};//

2、從原鍊錶的頭部乙個乙個取節點並插入到新鍊錶的頭部

class

solution

return

head;

}};//

使用乙個棧來解決問題,c++

#include

using

namespace

std;

class

solution

listnode * p =phead;

listnode *newhead;

stack

stack1;

while (p->next !=null)

newhead =p;

while (!stack1.empty())

p->next =null;

return

newhead;

}};//

題目描述

////

輸入乙個鍊錶,從尾到頭列印鍊錶每個節點的值。

//輸入描述 :

//輸入為鍊錶的表頭

////

//輸出描述 :

//輸出為需要列印的「新鍊錶」的表頭

#includeclass

solution

//while(!nodes.empty())

//vector

dev1;

if (head !=null)

dev1.push_back(head->val);

}return

dev1;

}};class

solution

while (!stack.empty())

}return

vector;

}};/*

***從原理上來說,借助棧會使得問題的解決思路非常簡單明瞭。

*注意函式的返回型別是int型別的vector

*/class

solution

//遍歷出棧

while (!nodes.empty())

return vec; //

返回值為int型的vector

}};

offer 鍊錶反轉和從尾到頭列印鍊錶

這個是高頻的面試題,今天總結了一些。反轉鍊錶用三個指標實現,返回新鍊錶的頭節點 而從尾到頭列印,應用棧實現,返回vector整個鍊錶。題目描述 輸入乙個鍊錶,反轉鍊錶後,輸出鍊錶的所有元素。struct listnode 思路 在反轉鍊錶的時候,我們很容易想到讓當前結點的next指向前乙個結點,但是...

劍指offer 從尾到頭列印鍊錶(鍊錶)

輸入乙個鍊錶,按煉錶值從尾到頭的順序返回乙個arraylist。1 將鍊錶反轉,會改變鍊錶的結構,一般不採用 2 使用棧,從頭到尾讀取資料並存入棧中,輸出棧中的全部內容 3 使用遞迴實現,遞迴在本質上就是乙個棧結構,每次列印當前值時,先列印後乙個值,使用遞迴 更簡潔。但是鍊錶過長將導致遞迴呼叫過深,...

從尾到頭輸出鍊錶

題目 輸入乙個鍊錶的頭結點,從尾到頭反過來輸出每個結點的值。鍊錶結點定義如下 struct listnode 分析 這是一道很有意思的面試題。該題以及它的變體經常出現在各大公司的面試 筆試題中。看到這道題後,第一反應是從頭到尾輸出比較簡單。於是很自然地想到把鍊錶中鏈結結點的指標反轉過來,改變鍊錶的方...