剑指offer--从尾到头打印链表
生活随笔
收集整理的這篇文章主要介紹了
剑指offer--从尾到头打印链表
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
記錄來自《劍指offer》的算法題目
鏈表應該是面試時被提及最頻繁的數據結構,它的結構簡單,由若干個結點連接成鏈狀結構,其創建、插入結點、刪除結點等操作都只需要20行左右的代碼就能實現,其代碼量比較適合面試。
假設單鏈表的結點定義如下:
struct ListNode{int m_nValue;ListNode* m_pNext; };往鏈表的末尾添加一個結點的代碼如下:
// 在鏈表結尾插入一個結點 void AddToTail(ListNode** pHead, int value){ListNode* pNew = new ListNode();pNew->m_nValue = value;pNew->m_pNext = NULL;if (*pHead == NULL){*pHead = pNew;}else{ListNode* pNode = *pHead;while (pNode->m_pNext != NULL)pNode = pNode->m_pNext;pNode->m_pNext = pNew;} }這里第一個參數pHead是一個指向指針的指針,因為在往一個空鏈表插入一個結點時,這個結點就是鏈表的頭指針,也就是會改動頭指針,因此必須把pHead參數設為指向指針的指針,否則出了這個函數pHead仍然是空指針。其測試代碼如下:
int main(void){ListNode* t = NULL;for (int i = 0; i < 10;i++)AddToTail(&t, i);return 0; }刪除某個結點的代碼如下:
// 刪除給定數值的結點 void RemoveNode(ListNode** pHead, int value){if (pHead == NULL || *pHead == NULL)return;ListNode* pToBeDeleted = NULL;if ((*pHead)->m_nValue == value){pToBeDeleted = *pHead;*pHead = (*pHead)->m_pNext;}else{ListNode* pNode = *pHead;while (pNode->m_pNext != NULL && pNode->m_pNext->m_nValue != value)pNode = pNode->m_pNext;if (pNode->m_pNext != NULL && pNode->m_pNext->m_nValue == value){pToBeDeleted = pNode->m_pNext;pNode->m_pNext = pNode->m_pNext->m_pNext;}}if (pToBeDeleted != NULL){delete pToBeDeleted;pToBeDeleted = NULL;} }下面是這道算法題的題目:
輸入一個鏈表的頭結點,從尾到頭反過來打印出每個結點的值。
這里假設不能修改鏈表的結構,首先肯定是需要遍歷整個鏈表,遍歷也是從頭到尾的順序,但輸出順序卻是從尾到頭,所以這里可以使用棧來進行輔助。因此,實現代碼如下:
// 從尾到頭打印鏈表,迭代輸出 void PrintListReversingly_Iteratively(ListNode* pHead){std::stack<ListNode*> nodes;ListNode* pNode = pHead;while (pNode != NULL){nodes.push(pNode);pNode = pNode->m_pNext;}while (!nodes.empty()){pNode = nodes.top();cout<<pNode->m_nValue<<" ";nodes.pop();}cout << endl; }這里既然想到使用棧來實現函數,而遞歸本質上就是一個棧結構,所以自然想到可以用遞歸來實現。實現代碼如下:
// 遞歸版本 void PrintListReversingly_Recursively(ListNode* pHead){if (pHead != NULL){if (pHead->m_pNext != NULL){PrintListReversingly_Recursively(pHead->m_pNext);}cout << pHead->m_nValue << " ";} }更完整的代碼例子可以查看從尾到頭打印鏈表。
總結
以上是生活随笔為你收集整理的剑指offer--从尾到头打印链表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JVM真香系列:.java文件到.cla
- 下一篇: http拨测是什么意思_HTTP 501