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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

用O(1)的时间复杂度删除单链表中的某个节点

發布時間:2023/12/20 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用O(1)的时间复杂度删除单链表中的某个节点 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

用O(1)的時間復雜度刪除單鏈表中的某個節點

給定鏈表的頭指針和一個結點指針,在O(1)時間刪除該結點。鏈表結點的定義如下:

struct ListNode {int m_nKey;ListNode* m_pNext; };

函數的聲明如下:

void DeleteNode(ListNode* pListHead, ListNode* pToBeDeleted);

這是一道廣為流傳的Google面試題,考察我們對鏈表的操作和時間復雜度的了解,咋一看這道題還想不出什么較好的解法,但人家把題出在這,肯定是有解法的。一般單鏈表刪除某個節點,需要知道刪除節點的前一個節點,則需要O(n)的遍歷時間,顯然常規思路是不行的。在仔細看題目,換一種思路,既然不能在O(1)得到刪除節點的前一個元素,但我們可以輕松得到后一個元素,這樣,我們何不把后一個元素賦值給待刪除節點,這樣也就相當于是刪除了當前元素。可見,該方法可行,但如果待刪除節點為最后一個節點,則不能按照以上思路,沒有辦法,只能按照常規方法遍歷,時間復雜度為O(n),是不是不符合題目要求呢?可能很多人在這就會懷疑自己的思考,從而放棄這種思路,最后可能放棄這道題,這就是這道面試題有意思的地方,雖看簡單,但是考察了大家的分析判斷能力,是否擁有強大的心理,充分自信。其實我們分析一下,仍然是滿足題目要求的,如果刪除節點為前面的n-1個節點,則時間復雜度為O(1),只有刪除節點為最后一個時,時間復雜度才為O(n),所以平均的時間復雜度為:(O(1) * (n-1) + O(n))/n = O(1);仍然為O(1).下面見代碼:

1 /* Delete a node in a list with O(1) 2 * input: pListHead - the head of list 3 * pToBeDeleted - the node to be deleted 4 */ 5 6 struct ListNode 7 { 8 int m_nKey; 9 ListNode* m_pNext; 10 }; 11 12 void DeleteNode(ListNode *pListHead, ListNode *pToBeDeleted) 13 { 14 if (!pListHead || !pToBeDeleted) 15 return; 16 17 if (pToBeDeleted->m_pNext != NULL) { 18 ListNode *pNext = pToBeDeleted->m_pNext; 19 pToBeDeleted->m_pNext = pNext->m_pNext; 20 pToBeDeleted->m_nKey = pNext->m_nKey; 21 22 delete pNext; 23 pNext = NULL; 24 } 25 else { //待刪除節點為尾節點 26 ListNode *pTemp = pListHead; 27 while(pTemp->m_pNext != pToBeDeleted) 28 pTemp = pTemp->m_pNext; 29 pTemp->m_pNext = NULL; 30 31 delete pToBeDeleted; 32 pToBeDeleted = NULL; 33 } 34 } 轉載自:http://www.cnblogs.com/bakari/p/4013812.html

總結

以上是生活随笔為你收集整理的用O(1)的时间复杂度删除单链表中的某个节点的全部內容,希望文章能夠幫你解決所遇到的問題。

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