當前位置:
首頁 >
《剑指offer》第十八题(在O(1)时间删除链表结点)
發(fā)布時間:2025/5/22
44
豆豆
生活随笔
收集整理的這篇文章主要介紹了
《剑指offer》第十八题(在O(1)时间删除链表结点)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
// 面試題18(一):在O(1)時間刪除鏈表結(jié)點
// 題目:給定單向鏈表的頭指針和一個結(jié)點指針,定義一個函數(shù)在O(1)時間刪除該
// 結(jié)點。
#include <iostream>
#include "List.h"void DeleteNode(ListNode** pListHead, ListNode* pToBeDeleted)
{if (!pListHead || !pToBeDeleted)return;// 第一種情況:要刪除的結(jié)點不是尾結(jié)點if (pToBeDeleted->m_pNext != nullptr){ListNode* pNext = pToBeDeleted->m_pNext;//得到待刪除節(jié)點的下一個節(jié)點pToBeDeleted->m_nValue = pNext->m_nValue;//將該節(jié)點的值和地址給覆蓋待刪除節(jié)點pToBeDeleted->m_pNext = pNext->m_pNext;delete pNext;//刪除這個替罪羊pNext = nullptr;}// 第二種情況:鏈表只有一個結(jié)點,刪除頭結(jié)點(也是尾結(jié)點)else if (*pListHead == pToBeDeleted){delete pToBeDeleted;pToBeDeleted = nullptr;*pListHead = nullptr;//注意吧頭結(jié)點置空
}// 第三種情況:鏈表中有多個結(jié)點,刪除尾結(jié)點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);//注意這個函數(shù)的輸入
printf("The result list is: \n");PrintList(pListHead);
}// 鏈表中有多個結(jié)點,刪除中間的結(jié)點
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);
}// 鏈表中有多個結(jié)點,刪除尾結(jié)點
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);
}// 鏈表中有多個結(jié)點,刪除頭結(jié)點
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);
}// 鏈表中只有一個結(jié)點,刪除頭結(jié)點
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;
}
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/CJT-blog/p/10485613.html
總結(jié)
以上是生活随笔為你收集整理的《剑指offer》第十八题(在O(1)时间删除链表结点)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: captcha.js一个生成验证码的插件
- 下一篇: 力扣——所有可能的满二叉树