#ifndef List_h__ #define List_h__ #include <stdio.h> struct ListNode { int value; ListNode* pNext; ListNode(int n) :value(n), pNext(nullptr){} }; class ListSolution { public: ListSolution& AddToTail(ListNode** ppHead, int value); ListSolution& RemoveNode(ListNode** ppHead, int value); ListSolution& RemoveAll(ListNode** ppHead); void Print(ListNode* pHead); }; #endif // List_h__
#include "List.h" ListSolution& ListSolution::AddToTail(ListNode** ppHead, int value) { if (!ppHead) { return *this; } ListNode* pNewNode = new ListNode(value); if (nullptr == *ppHead) { *ppHead = pNewNode; } else { ListNode* pCurNode = *ppHead; while (pCurNode->pNext) { pCurNode = pCurNode->pNext; } pCurNode->pNext = pNewNode; } return *this; } ListSolution& ListSolution::RemoveNode(ListNode** ppHead, int value) { if (nullptr == ppHead || nullptr == *ppHead) { return *this; } ListNode* pDelNode = nullptr; if (value == (*ppHead)->value) { pDelNode = *ppHead; *ppHead = (*ppHead)->pNext; } else { ListNode* pCurNode = (*ppHead); while (pCurNode->pNext && pCurNode->pNext->value != value) { pCurNode = pCurNode->pNext; } if (nullptr != pCurNode->pNext && pCurNode->pNext->value == value) { pDelNode = pCurNode->pNext; pCurNode->pNext = pCurNode->pNext->pNext; } } if (pDelNode) { printf("remove %d\n", pDelNode->value); delete pDelNode; pDelNode = nullptr; } return *this; } ListSolution& ListSolution::RemoveAll(ListNode** ppHead) { if (nullptr == ppHead || nullptr == *ppHead) { return *this; } ListNode* pCurNode = *ppHead; ListNode* pDelNode = nullptr; while (pCurNode->pNext) { pDelNode = pCurNode->pNext; pCurNode->pNext = pCurNode->pNext->pNext; printf("remove %d\n", pDelNode->value); delete pDelNode; pDelNode = nullptr; } printf("remove %d\n", (*ppHead)->value); delete *ppHead; *ppHead = nullptr; return *this; } void ListSolution::Print(ListNode* pHead) { ListNode* pCurNode = pHead; while (pCurNode) { printf(" %d", pCurNode->value); pCurNode = pCurNode->pNext; } printf("\n"); }
#include "List.h" int main() { ListSolution s; ListNode* pHead = nullptr; s.AddToTail(&pHead, 1); s.AddToTail(&pHead, 2); s.AddToTail(&pHead, 3); s.AddToTail(&pHead, 4); s.AddToTail(&pHead, 5); s.AddToTail(&pHead, 6); s.Print(pHead); s.RemoveNode(&pHead, 3); s.RemoveNode(&pHead, 1); s.RemoveNode(&pHead, 2); s.Print(pHead); s.RemoveAll(&pHead); s.AddToTail(nullptr, 1); s.Print(nullptr); s.RemoveNode(nullptr, 1); s.RemoveAll(nullptr); if (nullptr == pHead) { printf("pHead == nullptr\n"); } return 0; }