欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

《剑指offer》第十八题(在O(1)时间删除链表结点)

发布时间:2025/5/22 编程问答 45 豆豆
生活随笔 收集整理的这篇文章主要介绍了 《剑指offer》第十八题(在O(1)时间删除链表结点) 小编觉得挺不错的,现在分享给大家,帮大家做个参考.
// 面试题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: \n");PrintList(pListHead);printf("The node to be deleted is: \n");PrintListNode(pNode);DeleteNode(&pListHead, pNode);//注意这个函数的输入 printf("The result list is: \n");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; }

 

 

转载于:https://www.cnblogs.com/CJT-blog/p/10485613.html

总结

以上是生活随笔为你收集整理的《剑指offer》第十八题(在O(1)时间删除链表结点)的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。