單向鍊錶在O 1 時間內刪除乙個節點

2022-09-03 01:54:08 字數 1852 閱讀 8505

說刪鍊錶節點,第一時間想到就是遍歷整個鍊錶,找到刪除節點的前驅,改變節點指向,刪除節點,但是,這樣刪除單鏈表的某一節點,時間複雜度就是o(n),不符合要求;

時間複雜度是o(n)的做法就不說了,看看o(1)的寫法,看圖:

刪除節點,需要找到被刪節點的前驅,上面的說明,交換資料後,要刪的節點轉換為被刪節點的後乙個節點,此時被刪節點前驅可以知道,刪除就很簡單了

給出被刪節點指標,o(1)時間內就可以有此方法刪除節點,但是,如果,被刪節點是鍊錶最後乙個節點,以上方法明顯不在適用,不得不從頭遍歷:

這時就得從頭遍歷,只為找最後乙個節點的前驅,就這唯一乙個節點,找它的時間複雜度就是o(n),但平均時間複雜度為:

((n-1)*o(1)+o(n))/n    

結果還是o(1),復合要求的,又但是,這裡沒有考慮要刪除的節點是否在鍊錶中,如果要判斷有沒有在鍊錶中,又得遍歷,結果時間複雜度有不在是o(1),

為了保證時間,被刪的節點有沒有在鍊錶中,只能由人為的去控制;以下是**段:

//在o(1)時間內,刪除乙個節點,函式如下

void deletenodenumone(listnode** phead,listnode* ptobedelete)

//只有乙個節點

else if (*phead == ptobedelete)

//最後一種,刪除節點是尾節點

else

delete ptobedelete;

ptobedelete = nullptr;

cur->_next = nullptr;

} }

完整測試**:

#pragma once

typedef int datatype;

class listnode

public:

datatype _data;

listnode* _next;

};class slist

~slist()

void destory() }

public:

//尾插

void pushback(const datatype& x)

else

}//查詢

listnode* find(const datatype& x)

}return null;

} //

//在o(1)時間內,刪除乙個節點,函式如下

void deletenodenumone(listnode** phead,listnode* ptobedelete)

//只有乙個節點

else if (*phead == ptobedelete)

//最後一種,刪除節點是尾節點

else

delete ptobedelete;

ptobedelete = nullptr;

cur->_next = nullptr;

} }void print()

cout << "null" << endl;

}public:

listnode* _head;

listnode* _tail;

};void test()

測試結果:

賜教!

單向鍊錶在O 1 時間內刪除乙個節點

說刪鍊錶節點,第一時間想到就是遍歷整個鍊錶,找到刪除節點的前驅,改變節點指向,刪除節點,但是,這樣刪除單鏈表的某一節點,時間複雜度就是o n 不符合要求 時間複雜度是o n 的做法就不說了,看看o 1 的寫法,看圖 刪除節點,需要找到被刪節點的前驅,上面的說明,交換資料後,要刪的節點轉換為被刪節點的...

單向鍊錶在O 1 時間內刪除乙個節點

說刪鍊錶節點,第一時間想到就是遍歷整個鍊錶,找到刪除節點的前驅,改變節點指向,刪除節點,但是,這樣刪除單鏈表的某一節點,時間複雜度就是o n 不符合要求 時間複雜度是o n 的做法就不說了,看看o 1 的寫法,看圖 刪除節點,需要找到被刪節點的前驅,上面的說明,交換資料後,要刪的節點轉換為被刪節點的...

在O 1 時間內刪除鍊錶節點

題目 給定單向鍊錶的頭指標和乙個節點指標,定義乙個函式在o 1 的時間刪除該節點。struct listnode void deletenode listnode plisthead,listnode ptobedeleted 演算法思路 一般我們是從頭節點開始遍歷,知道找到要刪除的節點的前面乙個節...