問題描述:
給定單向鍊錶的頭指標和乙個結點指標;定義乙個函式在o(1)時間刪除鍊錶結點。鍊錶結點與函式的定義如下:
struct listnode
void deletenode(listnode** plisthead ,listnode* ptobedeleted);
思路:
在單向鍊錶中刪除乙個結點,最常用的做法無疑是從鍊錶的頭結點開始,順序遍歷查詢要刪除的結點,並在鍊錶中刪除該結點。
我們想刪除結點i,可以從鍊錶的頭結點a開始順序遍歷,發現結點h的m_pnext指向要刪除的結點i,於是我們就可以把結點h的m_pnext指向i的下乙個結點即結點j。指標調整之後,我們就可以安全地刪除結點i並保證鍊錶沒有斷開,這種思路的時間複雜度自然是o(n)了。
void deletenode(listnode** plisthead ,listnode* ptobedeleted)
else
pnode->m_pnext = ptobedeleted->m_pnext ;
delete ptobedeleted ;
ptobedeleted =
null ;
}}
a->b->...->h->i->j->....
a->b->...->h->j->....
之所以需要從頭開始查詢,是因為我們需要得到將被刪除的結點的前面乙個結點。在單向鍊錶中,結點中沒有指向前乙個結點的指標,所以只好從鍊錶的頭結點開始順序查詢。
那是不是一定需要得到被刪除的結點的前乙個結點呢?答案是否定的。我們可以很方便地得到要刪除的結點的下一結點。如果我們把下乙個結點的內容複製到需要刪除的結點上覆蓋原有的內容,再把下乙個結點刪除,那是不是相當於把當前需要刪除的結點刪除了?這裡使用一點點小的技巧。
如果要刪除的結點位於鍊錶的尾部,那麼他就沒下乙個結點,怎麼辦?我們仍然從鍊錶的頭結點開始,順序遍歷得到該結點的前序結點,並完成刪除操作。
最後需要注意的是,如果鍊錶只有乙個結點,此時我們在刪除結點之後,還需要把鍊錶的頭結點設定成null。
void deletenode(listnode** plisthead ,listnode* ptobedeleted)
else
if(ptobedeleted==*plisthead)
else
pnode->m_pnext =
null;
delete ptobedeleted;
ptobedeleted =
null;
}}
在O 1 時間刪除鍊錶結點
題目 給定單向鍊錶的頭指標和乙個結點指標,定義乙個函式在o 1 時間刪除該結點。鍊錶結點與函式的定義如下 struct listnode void deletenode listnode plisthead,listnode ptobedeleted 刪除結點的操作我們經常碰到,比如乙個鍊錶a b ...
在O 1 時間刪除鍊錶結點
題目 題目 給定鍊錶的頭指標和乙個結點指標,在o 1 時間刪除該結點。思路 通常情況下,如果我們要刪除單鏈表的乙個節點,我們需要遍歷鍊錶找到這個節點的前乙個節點,然後執行刪除操作,時間複雜度為o n 我們試著換一種思路,事實上,我們可以從給定的結點得到它的下乙個結點。這個時候我們實際刪除的是它的下乙...
在O 1 時間刪除鍊錶結點
並不是一定需要得到被刪除的結點的前乙個結點,可以將被刪除結點的後乙個結點的內容複製到被刪除結點,然後將後乙個結點刪除。鍊錶只有乙個結點,刪除頭結點 也是尾結點 else if plisthead ptobedeleted 要刪除的結點是尾結點 上面的解法有乙個假設 要刪除的結點的確在鍊錶中。需要o ...