連結串列C++ | 從尾部列印頭部(使用棧、遞迴實現)_3
阿新 • • 發佈:2019-01-10
從尾部列印頭部
棧 - 實現:
void printListReversingly_Iteratively(ListNode** pHead) { std::stack<ListNode*> nodes; ListNode* pNode = *pHead; while(pNode!=nullptr){ nodes.push(pNode); pNode = pNode->m_pNext;} while(!nodes.empty()){ pNode = nodes.top(); printf("%d ",pNode->m_nValue); nodes.pop();} }
測試程式碼:
#include<iostream> #include<stack> struct ListNode{ int m_nValue; ListNode* m_pNext; }; ListNode* AddToTail(ListNode** pHead, int Value) { ListNode* pNew = new ListNode(); pNew->m_nValue = Value; pNew->m_pNext = nullptr; if(*pHead == NULL){ *pHead = pNew;} else{ ListNode* pNode = *pHead; while(pNode->m_pNext != nullptr) pNode = pNode->m_pNext; pNode->m_pNext = pNew;} return *pHead; } void Delete(ListNode** pHead, int value) { if(pHead == nullptr || *pHead == nullptr) return; ListNode* pToBeDelete = *pHead; if(value == 1) *pHead = pToBeDelete->m_pNext; else{ ListNode* pNode = *pHead; for(int i=0;i<value-2;i++) pNode = pNode->m_pNext; pToBeDelete = pNode->m_pNext; pNode->m_pNext = pToBeDelete->m_pNext; } if(pToBeDelete!=nullptr){ delete pToBeDelete; pToBeDelete = nullptr; } } void print(ListNode* pHead){ printf("LinkedList is:\n"); while(pHead!=nullptr) { printf("%d ", pHead->m_nValue); pHead = pHead->m_pNext; } printf("\n"); } void printListReversingly_Iteratively(ListNode** pHead) { std::stack<ListNode*> nodes; ListNode* pNode = *pHead; while(pNode!=nullptr){ nodes.push(pNode); pNode = pNode->m_pNext;} while(!nodes.empty()){ pNode = nodes.top(); printf("%d ",pNode->m_nValue); nodes.pop();} } int main(){ ListNode* pHead = nullptr; pHead = AddToTail(&pHead, 1); pHead = AddToTail(&pHead, 2); pHead = AddToTail(&pHead, 3); pHead = AddToTail(&pHead, 4); Delete(&pHead, 1); print(pHead); printListReversingly_Iteratively(&pHead); }
執行結果:
遞迴 - 實現:
void printListReversingly_Recurrsively(ListNode* pHead)
{
if(pHead!=nullptr){
if(pHead->m_pNext!=nullptr){
PrintListReversingly_Recurrsively(pHead->m_pNext);
}
printf("%d\t", pHead->m_nValue);
}
}
測試程式碼:
#include<iostream> #include<stack> struct ListNode{ int m_nValue; ListNode* m_pNext; }; ListNode* AddToTail(ListNode** pHead, int Value) { ListNode* pNew = new ListNode(); pNew->m_nValue = Value; pNew->m_pNext = nullptr; if(*pHead == NULL){ *pHead = pNew;} else{ ListNode* pNode = *pHead; while(pNode->m_pNext != nullptr) pNode = pNode->m_pNext; pNode->m_pNext = pNew;} return *pHead; } void Delete(ListNode** pHead, int value) { if(pHead == nullptr || *pHead == nullptr) return; ListNode* pToBeDelete = *pHead; if(value == 1) *pHead = pToBeDelete->m_pNext; else{ ListNode* pNode = *pHead; for(int i=0;i<value-2;i++) pNode = pNode->m_pNext; pToBeDelete = pNode->m_pNext; pNode->m_pNext = pToBeDelete->m_pNext; } if(pToBeDelete!=nullptr){ delete pToBeDelete; pToBeDelete = nullptr; } } void print(ListNode* pHead){ printf("LinkedList is:\n"); while(pHead!=nullptr) { printf("%d ", pHead->m_nValue); pHead = pHead->m_pNext; } printf("\n"); } //void printListReversingly_Iteratively(ListNode** pHead) //{ // std::stack<ListNode*> nodes; // // ListNode* pNode = *pHead; // while(pNode!=nullptr){ // nodes.push(pNode); // pNode = pNode->m_pNext;} // // printf("Revers LinkedList is:\n"); // while(!nodes.empty()){ // pNode = nodes.top(); // printf("%d ",pNode->m_nValue); // nodes.pop();} //} void printListReversingly_Recurrsiverly(ListNode* pHead) { if(pHead!=nullptr){ if(pHead->m_pNext!=nullptr){ printListReversingly_Recurrsiverly(pHead->m_pNext); } printf("%d ",pHead->m_nValue); } } int main(){ ListNode* pHead = nullptr; pHead = AddToTail(&pHead, 1); pHead = AddToTail(&pHead, 2); pHead = AddToTail(&pHead, 3); pHead = AddToTail(&pHead, 4); Delete(&pHead, 1); print(pHead); // printListReversingly_Iteratively(&pHead); printListReversingly_Recurrsiverly(pHead); }
執行結果:
對程式碼不滿足,是任何真正有天才的程式設計師的根本特徵。