// 面试题18(一):在O(1)时间删除链表结点 // 题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该 // 结点。 #include <iostream> #include "List.h" void DeleteNode(ListNode** pListHead, ListNode* pToBeDeleted) { if (!pListHead || !pToBeDeleted) return; // 第一种情况:要删除的结点不是尾结点 if (pToBeDeleted->m_pNext != nullptr) { ListNode* pNext = pToBeDeleted->m_pNext;//得到待删除节点的下一个节点 pToBeDeleted->m_nValue = pNext->m_nValue;//将该节点的值和地址给覆盖待删除节点 pToBeDeleted->m_pNext = pNext->m_pNext; delete pNext;//删除这个替罪羊 pNext = nullptr; } // 第二种情况:链表只有一个结点,删除头结点(也是尾结点) else if (*pListHead == pToBeDeleted) { delete pToBeDeleted; pToBeDeleted = nullptr; *pListHead = nullptr;//注意吧头结点置空 } // 第三种情况:链表中有多个结点,删除尾结点 else { ListNode* pNode = *pListHead; while (pNode->m_pNext != pToBeDeleted)//只能通过顺序查找并删除了 { pNode = pNode->m_pNext; } pNode->m_pNext = nullptr; delete pToBeDeleted; pToBeDeleted = nullptr; } } // ====================测试代码==================== void Test(ListNode* pListHead, ListNode* pNode) { printf("The original list is: "); PrintList(pListHead); printf("The node to be deleted is: "); PrintListNode(pNode); DeleteNode(&pListHead, pNode);//注意这个函数的输入 printf("The result list is: "); PrintList(pListHead); } // 链表中有多个结点,删除中间的结点 void Test1() { ListNode* pNode1 = CreateListNode(1); ListNode* pNode2 = CreateListNode(2); ListNode* pNode3 = CreateListNode(3); ListNode* pNode4 = CreateListNode(4); ListNode* pNode5 = CreateListNode(5); ConnectListNodes(pNode1, pNode2); ConnectListNodes(pNode2, pNode3); ConnectListNodes(pNode3, pNode4); ConnectListNodes(pNode4, pNode5); Test(pNode1, pNode3); DestroyList(pNode1); } // 链表中有多个结点,删除尾结点 void Test2() { ListNode* pNode1 = CreateListNode(1); ListNode* pNode2 = CreateListNode(2); ListNode* pNode3 = CreateListNode(3); ListNode* pNode4 = CreateListNode(4); ListNode* pNode5 = CreateListNode(5); ConnectListNodes(pNode1, pNode2); ConnectListNodes(pNode2, pNode3); ConnectListNodes(pNode3, pNode4); ConnectListNodes(pNode4, pNode5); Test(pNode1, pNode5); DestroyList(pNode1); } // 链表中有多个结点,删除头结点 void Test3() { ListNode* pNode1 = CreateListNode(1); ListNode* pNode2 = CreateListNode(2); ListNode* pNode3 = CreateListNode(3); ListNode* pNode4 = CreateListNode(4); ListNode* pNode5 = CreateListNode(5); ConnectListNodes(pNode1, pNode2); ConnectListNodes(pNode2, pNode3); ConnectListNodes(pNode3, pNode4); ConnectListNodes(pNode4, pNode5); Test(pNode1, pNode1); DestroyList(pNode1); } // 链表中只有一个结点,删除头结点 void Test4() { ListNode* pNode1 = CreateListNode(1); Test(pNode1, pNode1); } // 链表为空 void Test5() { Test(nullptr, nullptr); } int main(int argc, char* argv[]) { Test1(); Test2(); Test3(); Test4(); Test5(); system("pause"); return 0; }