在O(1)時間內刪除連結串列節點
阿新 • • 發佈:2019-02-13
#include<iostream> using namespace std; struct ListNode { int data; ListNode* pNext; }; //構造連結串列 ListNode* InsertNode(ListNode* &pHead,int data) { ListNode* pNew = new ListNode(); pNew->data = data; pNew->pNext = NULL; if(NULL == pHead) { pHead = pNew; } else { ListNode* pNode = pHead; while(pNode->pNext != NULL) pNode = pNode->pNext; pNode->pNext = pNew; } return pNew; } //刪除指定節點 void DeleteNode(ListNode* &pHead,ListNode* pToBeDeleted) { if(!pHead || !pToBeDeleted) return; //先判斷是不是尾節點 if(pToBeDeleted->pNext != NULL) { ListNode* pNextOne = pToBeDeleted->pNext;//複製下個節點 pToBeDeleted->data = pNextOne->data;//把下個節點賦值給要刪除的節點 pToBeDeleted->pNext = pNextOne->pNext;//要刪除的節點直接指向下下個,然後刪除下個節點 delete pNextOne; pNextOne = NULL; } //連結串列只有一個節點 else if(pHead == pToBeDeleted) { delete pToBeDeleted; pToBeDeleted = NULL; pHead = NULL; } //是尾節點,需要從頭遍歷 else { ListNode* pNode = pHead; while(pNode->pNext != pToBeDeleted) pNode = pNode->pNext; pNode->pNext = NULL; delete pToBeDeleted; pToBeDeleted = NULL; } } //輸出連結串列 void PrintList(ListNode* &pHead) { if(NULL == pHead) return; ListNode* pNode = pHead; while (NULL != pNode) { cout << pNode->data << " "; pNode = pNode->pNext; } cout << endl; } int _tmain(int argc, _TCHAR* argv[]) { int num = 0; ListNode* pHead = NULL; ListNode* pToBeDeleted = NULL; ListNode* pNode1 = InsertNode(pHead,1); ListNode* pNode2 = InsertNode(pHead,3); ListNode* pNode3 = InsertNode(pHead,5); ListNode* pNode4 = InsertNode(pHead,7); ListNode* pNode5 = InsertNode(pHead,9); cout << "輸出原來的連結串列:" << endl; PrintList(pHead); DeleteNode(pHead,pNode3); cout << "輸出刪除節點3後的連結串列:" << endl; PrintList(pHead); system("pause"); return 0; }