題目:給定單向鍊錶的頭指標和乙個結點指標,定義乙個函式在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...