劍指offer 學習筆記 鍊錶

2021-10-02 16:21:53 字數 2069 閱讀 5849

我們說鍊錶是一種動態資料結構是因為在建立鍊錶時,無需知道鍊錶的長度。當插入乙個節點時,我們只需要為新節點分配記憶體,然後調整指標的指向來確保新節點被鏈結到鍊錶當中。記憶體分配不是建立鍊錶時一次性完成的,而是每新增乙個節點分配一次記憶體,由於沒有閒置的記憶體,鍊錶的空間效率比較高。

如果單向鍊錶的節點定義如下:

struct listnode 

;

往該鍊錶的末尾新增乙個節點:

void

addtotail

(listnode *

*phead,

int value)

else

pnode-

>m_pnext = pnew;

// 將鍊錶末尾元素的指標指向新節點

}}

以上**中,函式的第乙個引數是指向指標的指標,因為當鍊表為空時,新插入的節點就是頭指標,此時我們會改動頭指標,因此需要指向指標的指標,否則出了函式頭指標還是空。

如想在鍊錶中找到第i個節點,我們只能從頭節點開始,沿著指向下乙個節點的指標遍歷鍊錶,時間效率為o(n)。而在陣列中,我們可以根據下標在o(1)的時間內找到第i個元素。

在鍊錶中找到第乙個含有某值的節點並刪除節點:

void

removenode

(listnode*

* phead,

int value)

listnode* tobedelete =

nullptr;if

((*phead)

->m_nvalue == value)

else

if(pnode-

>m_pnext !=

nullptr)}

if(tobedelete !=

nullptr

)return

;}

面試題6:輸入乙個鍊錶的頭節點,從尾到頭反過來列印出每個節點的值,鍊錶節點定義如上。

很多人第一反應是從頭到尾輸出比較簡單,於是很自然想到把鍊錶中鏈結節點的指標反過來,改變鍊錶方向,但該方法會改變鍊錶結構,該方法能否使用取決於能否改變鍊錶結構。

通常列印是乙個唯讀操作,我們不希望列印時修改內容。解決問題過程肯定要遍歷鍊錶,遍歷順序是從頭到尾,而輸出順序是從尾到頭。也就是說,第乙個遍歷到的節點最後輸出,這是典型的後進先出,可以使用棧實現此順序:

#include

#include

using

namespace std;

struct listnode

;void

addtotail

(listnode*

* phead,

int value)

else

pnode-

>m_pnext = pnew;

// 尾插}}

void

printlistreversingly_iteratively

(listnode* phead)

while

(!nodes.

empty()

)}intmain()

既然想到用棧來實現這個函式,而遞迴本質上就是乙個棧結構,於是很自然又想到用遞迴來實現:

#include

#include

using

namespace std;

struct listnode

;void

addtotail

(listnode*

* phead,

int value)

else

pnode-

>m_pnext = pnew;}}

void

printlistreversingly_recursively

(listnode* phead)

}int

main()

以上**很簡潔,但當鍊錶很長時,會導致函式呼叫的層級很深,有可能導致函式呼叫棧溢位。顯然用棧基於迴圈實現的**魯棒性要好一些。

劍指offer 學習筆記 反轉鍊錶

面試題24 反轉鍊錶。定義乙個函式,輸入乙個鍊錶的頭節點,反轉該鍊錶並輸出反轉後鍊錶的頭節點,鍊錶節點定義如下 struct listnode include include using namespace std struct listnode listnode reverselist listn...

劍指offer 鍊錶

單向鍊錶的結構定義 typedef int datatype struct listnode 問題1 往鍊錶的末尾新增乙個結點 給定頭結點,往末尾插入乙個結點 void insertnode listnode head,datatype key listnode p head while p nex...

劍指offer 鍊錶

鍊錶 鍊錶是一種動態資料結構 struct listnode 往鍊錶的末尾新增乙個節點的c 程式如下 void addtotail listnode phead,int value 注意第乙個引數phead是乙個指向指標的指標。當我們往乙個空鍊錶插入乙個結點時,else pnode m pnext ...