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

2021-06-27 13:16:21 字數 1310 閱讀 8170

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

struct listnode

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

演算法思路:

一般我們是從頭節點開始遍歷,知道找到要刪除的節點的前面乙個節點,但是時間複雜度為o(n)

改進思路:找到要刪除的節點pdeletenode的下乙個節點pnext,把下乙個節點的值(pnext->m_nvalue)

賦給要刪除的節點(pdeletenode->m_nvalue),再把要刪除的節點指向下乙個節點的下乙個節點:(pdelete->m_pnext = pnext->m_pnext)

然後再把pnext節點刪除,pnext = null;

**:

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

//#include "stdafx.h"

#includeusing namespace std;

/*演算法思路:

一般我們是從頭節點開始遍歷,知道找到要刪除的節點的前面乙個節點,但是時間複雜度為o(n)

然後再把pnext節點刪除,pnext = null;

*/struct listnode

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

if (ptobedeleted->m_pnext != null)//刪除的節點不是尾巴節點

else if (*plisthead == ptobedeleted)//鍊錶只有乙個節點,刪除頭節點也是尾巴節點

else//鍊錶中有多個節點,刪除尾巴節點

pnode->m_pnext = ptobedeleted->m_pnext;

delete ptobedeleted;

ptobedeleted = null; }}

/*對於尾巴節點而言,由於仍然需要順序查詢,時間複雜度是o(n).因此總的平均時間複雜度是[(n-1)*o(1)+o(n)]/n,因此平均時間

複雜度是o(1);

*/int _tmain(int argc, _tchar* argv)

對於n-1個非尾巴節點而言,我們可以在o(1)的時間把下乙個節點的記憶體複製覆蓋要刪除的節點,並刪除下乙個節點;

對於尾巴節點而言,由於仍然需要順序查詢,時間複雜度是o(n).因此總的平均時間複雜度是[(n-1)*o(1)+o(n)]/n,

因此平均時間複雜度是o(1);

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

解題思路 如果該節點不是尾節點,那麼可以直接將下乙個節點的值賦給該節點,然後令該節點指向下下個節點,再刪除下乙個節點,時間複雜度為 o 1 如果鍊錶只有乙個節點,那麼直接 否則,就需要先遍歷鍊錶,找到節點的前乙個節點,然後讓前乙個節點指向 null,時間複雜度為 o n 綜上,如果進行 n 次操作,...

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

from acwing 28 time limit 1s memory limit 64mb problem description 給定單向鍊錶的乙個節點指標,定義乙個函式在o 1 時間刪除該結點。假設鍊錶一定存在,並且該節點一定不是尾節點。sample 輸入 鍊錶 1 4 6 8 刪掉節點 第2...

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

如果該節點不是尾節點,那麼可以直接將下乙個節點的值賦給該節點,然後令該節點指向下下個節點,再刪除下乙個節點,時間複雜度為 o 1 否則,就需要先遍歷鍊錶,找到節點的前乙個節點,然後讓前乙個節點指向 null,時間複雜度為 o n 綜上,如果進行 n 次操作,那麼大約需要操作節點的次數為 n 1 n ...