劍指offer 4 O 1 時間刪除鍊錶結點

2021-07-23 09:40:24 字數 1641 閱讀 1537

題目:給定單向鍊錶的頭指標和乙個結點指標,定義乙個函式在o(1)時間刪除該結點,鍊錶結點與 函式的定義如下:

struct listnode

;void deletenode(listnode** plisthead, listnode* ptobedeleted);

按照常規做法,從頭結點乙個乙個順序查詢肯定是超時的,需要o(n)時間,可以考慮先將要刪除結點的後繼結點賦值給當前結點,然後將後繼結點刪掉,最後把當前結點與它的下下個結點相連不久行了麼?

這個問題考察了對鍊錶的基本操作,值得好好總結,完整**如下:

// deletenode.cpp : 定義控制台應用程式的入口點。

//#include

"stdafx.h"

#include

using namespace std;

struct listnode

;listnode* createlistnode(int value)

void connectlistnodes(listnode* pcurrent, listnode* pnext)

pcurrent->m_pnext = pnext;

}void printlistnode(listnode* pnode)

else

}void printlist(listnode* phead)

cout << ("\nprintlist ends.\n");

}void destroylist(listnode* phead)

}void addtotail(listnode** phead, int value)

else

}void removenode(listnode** phead, int value)

else

}if (ptobedeleted !=

null)

}void deletenode(listnode** plisthead, listnode* ptobedeleted)

// 鍊錶只有乙個結點,刪除頭結點(也是尾結點)

else

if (*plisthead == ptobedeleted)

// 鍊錶中有多個結點,刪除尾結點

else

pnode->m_pnext =

null;

delete ptobedeleted;

ptobedeleted =

null;

}}// ********************測試**********************

void test(listnode* plisthead, listnode* pnode)

// 鍊錶中有多個結點,刪除中間的結點

void test1()

// 鍊錶中有多個結點,刪除尾結點

void test2()

// 鍊錶中有多個結點,刪除頭結點

void test3()

// 鍊錶中只有乙個結點,刪除頭結點

void test4()

// 鍊錶為空

void test5()

int _tmain(int argc, _tchar* argv)

劍指Offer之 在O 1 時間刪除鍊錶結點

給定單向鍊錶的頭指標和乙個結點指標,定義乙個函式在o 1 時間刪除該結點。3種情況 1 只有乙個結點,且要刪除的就是第乙個結點?遇到鍊錶時一定要單獨考慮只有乙個結點的情況 2 要刪除的結點不是最後乙個結點,這時不需要查詢,直接用後面乙個結點的值代替前面乙個結點,然後刪除後乙個結點 3 要刪除的結點是...

劍指offer 在O 1 時間刪除鍊錶結點

題目 給定單向鍊錶的頭指標和乙個指標,定義乙個函式在o 1 時間刪除該結點 class node public string getvalue public void setvalue string value public node getnext public void setnext node...

劍指offer 在O(1)時間刪除鍊錶節點

題目描述 給定單鏈表的頭結點和待刪除結點,在o 1 時間刪除鍊錶節點 class listnode 常規方法從煉表頭結點沿著鍊錶找到待刪除結點完成刪除操作。時間複雜度o n 可以將待刪除結點的下一結點內容複製到待刪除結點上,將待刪除結點的下一結點指向待刪除結點的的下一結點的下一結點。時間複雜度o 1...