[剑指offer]面试题13:在O(1)时间删除链表结点
生活随笔
收集整理的這篇文章主要介紹了
[剑指offer]面试题13:在O(1)时间删除链表结点
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
面試題13:在O(1)時間刪除鏈表結點
題目:給定單向鏈表的頭指針和一個結點指針,定義一個函數在 O(1)時間刪除該結點。鏈表結點與函數的定義如下:
代碼如下:
struct ListNode {int value;ListNode *next; };void DeleteNode(ListNode ** pListHead, ListNode *pToBeDeleted) {if (!pListHead || !pToBeDeleted) return;//要刪除的結點不是尾結點if (pToBeDeleted->next != nullptr){ListNode *pNext = pToBeDeleted->next;pToBeDeleted->value = pNext->value;pToBeDeleted->next = pNext->next;delete pNext;pNext = nullptr;}//鏈表只有一個結點,刪除頭結點(也是尾結點)else if (*pListHead == pToBeDeleted){delete pToBeDeleted;pToBeDeleted = nullptr;*pListHead = nullptr;}//鏈表中有多個結點,刪除尾結點else{ListNode *pNode = *pListHead;while (pNode->next != pToBeDeleted){pNode = pNode->next;}pNode->next = nullptr;delete pToBeDeleted;pToBeDeleted = nullptr;} }測試用例:
● 功能測試(從有多個結點的鏈表的中間刪除一個結點,從有多個結點的鏈表中刪除頭結點,從有多個結點的鏈表中刪除尾結點,從只有一個結點的鏈表中刪除唯一的結點)。
● 特殊輸入測試(指向鏈表頭結點指針的為 NULL 指針,指向要刪除的結點為NULL指針)。
本題考點:
● 考查應聘者對鏈表的編程能力。
● 考查應聘者的創新思維能力。這道題要求應聘者打破常規的思維模式。當我們想刪除一個結點時,并不一定要刪除這個結點本身。可以先把下一個結點的內容復制出來覆蓋被刪除結點的內容,然后把下一個結點刪除。這種思路不是很容易想到的。
● 考查應聘者思維的全面性。即使應聘者想到刪除下一個結點這個辦法,也未必能通過這輪面試。應聘者要全面考慮到刪除的結點位于鏈表的尾部及輸入的鏈表只有一個結點這些特殊情況。
總結
以上是生活随笔為你收集整理的[剑指offer]面试题13:在O(1)时间删除链表结点的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [剑指offer]面试题10:二进制中1
- 下一篇: [剑指offer]面试题15:链表中倒数