說刪鍊錶節點,第一時間想到就是遍歷整個鍊錶,找到刪除節點的前驅,改變節點指向,刪除節點,但是,這樣刪除單鏈表的某一節點,時間複雜度就是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 演算法思路 一般我們是從頭節點開始遍歷,知道找到要刪除的節點的前面乙個節...