給定單向鏈表的頭指針和一個(gè)結(jié)點(diǎn)指針,定義一個(gè)函數(shù)在O(1)時(shí)間刪除該結(jié)點(diǎn)。
成都創(chuàng)新互聯(lián)于2013年開始,先為樊城等服務(wù)建站,樊城等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為樊城企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。因?yàn)橐髸r(shí)間復(fù)雜度為O(1),所以肯定不能遍歷鏈表,那樣的話時(shí)間復(fù)雜度就是O(N)了;可以想到,其實(shí)要求刪除該結(jié)點(diǎn),真正的目的并不是要將結(jié)點(diǎn)的數(shù)據(jù)包括結(jié)點(diǎn)所占的內(nèi)存都給刪除,只是想讓數(shù)據(jù)消失就可以了,至于結(jié)點(diǎn),除去任意一個(gè)結(jié)點(diǎn)所占的空間都是OK的;
所以,這里換一種思路,若要?jiǎng)h除指定的結(jié)點(diǎn),一般需要將前一個(gè)結(jié)點(diǎn)的next指針指向要?jiǎng)h除結(jié)點(diǎn)的下一個(gè)結(jié)點(diǎn),這樣要?jiǎng)h除的結(jié)點(diǎn)就可以脫離鏈表而被刪除了,但這里關(guān)鍵就是即是單鏈表沒有prev的指針也沒辦法遍歷鏈表找到前一個(gè)結(jié)點(diǎn),但是可以知道要?jiǎng)h除結(jié)點(diǎn)的下一個(gè)結(jié)點(diǎn)和下下個(gè)結(jié)點(diǎn)啊,因此可以用代替刪除法,用下一個(gè)結(jié)點(diǎn)來代替要?jiǎng)h除的結(jié)點(diǎn)去“死”,而二者的數(shù)據(jù)只需要交換一下就可以了,因此刪除的結(jié)點(diǎn)位置不過是下一個(gè)結(jié)點(diǎn),而數(shù)據(jù)還是要?jiǎng)h除的數(shù)據(jù);
程序設(shè)計(jì)如下:
#include <iostream> #include <assert.h> using namespace std; template <class T> struct ListNode //鏈表結(jié)點(diǎn)結(jié)構(gòu)體 { T _data; ListNode<T>* _next; }; template <class T> ListNode<T>* buy_node(T data) //構(gòu)建鏈表結(jié)點(diǎn) { ListNode<T>* tmp = new ListNode<T>; tmp->_data = data; tmp->_next = NULL; return tmp; } template <class T> void init_list(ListNode<T>** node, T data) //初始化鏈表 { *node = buy_node(data); } template <class T> void push_node(ListNode<T>*& head, T data) //在鏈表中鏈入結(jié)點(diǎn) { if(head == NULL) { init_list(&head, data); return; } ListNode<T>* tmp = head; while(tmp->_next != NULL) { tmp = tmp->_next; } tmp->_next = buy_node(data); } template <class T> void print_list(ListNode<T>* head) //打印鏈表 { while(head != NULL) { cout<<head->_data<<"->"; head = head->_next; } cout<<"NULL"<<endl; } template <class T> void destroy_list(ListNode<T>*& head) //刪除銷毀鏈表 { if(head != NULL) { ListNode<T>* cur = head; ListNode<T>* tmp = head; while(cur != NULL) { tmp = cur; cur = cur->_next; delete tmp; } head = NULL; } } template <class T> ListNode<T>* GetNode(ListNode<T>* pHead, size_t n) //獲取要?jiǎng)h除結(jié)點(diǎn)的地址 { assert(pHead); ListNode<T>* tmp = pHead; while(((--n) != 0) && (tmp != NULL)) { tmp = tmp->_next; } if(tmp == NULL) return NULL; else return tmp; } template <class T> void DeleteNode(ListNode<T>* pHead, ListNode<T>* dNode) //刪除指定結(jié)點(diǎn) { assert(pHead && dNode); if(dNode->_next == NULL) { delete dNode; dNode = NULL; return; } ListNode<T>* tmp = dNode->_next; swap(dNode->_data, tmp->_data); dNode->_next = tmp->_next; delete tmp; tmp = NULL; } int main() { ListNode<int>* list = NULL; push_node(list, 1); push_node(list, 2); push_node(list, 3); push_node(list, 4); push_node(list, 5); push_node(list, 6); push_node(list, 7); push_node(list, 8); push_node(list, 9); cout<<"print list: "; print_list(list); cout<<"delete Node later: "; ListNode<int>* dNode = GetNode(list, 4); DeleteNode(list, dNode); print_list(list); destroy_list(list); return 0; }
運(yùn)行程序,得結(jié)果:
《完》
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
分享名稱:在O(1)時(shí)間刪除鏈表結(jié)點(diǎn)——13-創(chuàng)新互聯(lián)
轉(zhuǎn)載源于:http://vcdvsql.cn/article30/cdihpo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開發(fā)、標(biāo)簽優(yōu)化、微信公眾號(hào)、營銷型網(wǎng)站建設(shè)、靜態(tài)網(wǎng)站、網(wǎng)站導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容