面試題5 從尾到頭列印鍊錶

2021-07-28 02:20:25 字數 1354 閱讀 2671

鍊錶的建立,插入結點,刪除結點等操作都只需要20行左右的**來實現。

鍊錶是一種動態資料結構,因為在建立鍊錶的時候,無須知道鍊錶的長度。當插入乙個結點的時候,只需要為新結點分配記憶體,然後調整指標的指向來確保新結點被鏈結到鍊錶當中。記憶體分配不是在建立鍊錶的時候一次完成的,而是每新增乙個結點分配一次記憶體。

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

struct listnode

1.往鍊錶的末尾中新增乙個結點的**如下:

void addtotail(listnode** phead,int value)

else

}

2.由於鍊錶中的記憶體不是一次性分配的,因此我們無法保證鍊錶的記憶體和陣列一樣是連續的。因此,如果想在鍊錶中找到它的第i個結點,我們只能從頭結點開始,沿著指向下乙個結點的指標遍歷鍊錶,它的時間效率為o(n)。而在陣列中,我們可以根據下標在o(1)時間內找到第i個元素。

下面是在鍊錶中找到第乙個含有某值得結點並刪除該結點的**:

void removenode(listnode** phead,int value)

else

}if(ptobedeleted!=

null)

}

題目:輸入乙個鍊錶的頭結點,從尾到頭反過來列印出每個結點的值。

分析:

通常列印是乙個唯讀操作,不希望列印的時候修改內容。假設面試官也要求這個題目不能改變鍊錶的結構。接下來想到的解決這個問題肯定要遍歷鍊錶。遍歷的順序是從頭到尾的順序,可輸出的順序是從尾到頭的順序。也就是第乙個遍歷到的結點最後乙個輸出,最後乙個遍歷到的結點第乙個輸出。這是典型的「後進先出」,可以用棧實現這種順序。每進過乙個結點的時候,把該結點放到乙個棧中。當遍歷完整個鍊錶後,再從棧頂開始逐個輸出結點的值,此時輸出的結點的順序已經反轉過來了。

這種思路的**如下:

void printlistreversingly_iteratively(listnode* phead)

while(!nodes.empty())

}

既然想到了用棧來實現這個函式,而遞迴本質上就是乙個棧結構。要實現反過來輸出鍊錶,我們每訪問到乙個結點的時候,就先遞迴輸出它後面的結點,再輸出該結點自身,這樣鍊錶的輸出結果就反過來了。

**如下:

void printlistreversingly_recurisively(listnode* phead)

printf("%d\t",phead->m_nvalue);

}}

面試題5 從尾到頭列印鍊錶

方法一 使用棧 html view plain copy include stack include stdio.h typedef struct listnode listnode listnode createlistnode int value void connectlistnode lis...

面試題5 從尾到頭列印鍊錶

題目 輸入乙個鍊錶的頭結點,從尾到頭反過來列印出每個節點的值。鍊錶定義結構如下 struct listnode 通常遍歷的順序是從頭到尾的順序,可輸出的順序確是從尾到頭。也就是說第乙個遍歷到的節點最後乙個輸出,而最後乙個遍歷到的節點第乙個輸出。這就是典型的 後進先出 我們可以用棧實現這種順序。每經過...

面試題5 從尾到頭列印鍊錶

題目 輸入乙個鍊錶的頭結點,從尾到頭反過來列印出每個結點的值。鍊錶結點定義如下 struct listnode 看到這道題後,很多人的第一反應是從頭到尾輸出將會比較簡單,於是我們很自然的想到把鍊錶中鏈結結點的指標反轉過來,改變鍊錶的方向,然後就可以從頭到尾輸出了。但該方法會改變原來鍊錶的結構。是否允...