日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

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

编程问答

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

發布時間:2025/5/22 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《剑指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)时间删除链表结点)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。