劍指offer 面試題18 刪除鍊錶的節點

2021-10-23 09:49:30 字數 3000 閱讀 7761

題目二:刪除鍊錶中連續重複的節點

筆記:題目一:在o(1)時間內刪除鍊錶節點

題目描述:

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

//鍊錶節點定義

struct listnode

;void

deletenode

(listnode*

* plisthead, listnode*ptobedeleted)

;

思路分析:

首先刪除鍊錶中的節點有兩種方法:

void

deletenode

(listnode*

* plisthead, listnode*ptobedeleted)

//將要刪除節點的前乙個節點的next指向要刪除節點的下乙個節點

pnode-

>next = ptobedeleted-

>next;

//刪除要刪除的節點

delete ptobedeleted;

ptobedeleted =

nullptr

;}

void

deletenode

(listnode*

* plisthead, listnode* ptobedeleted)

以上是兩種刪除節點的思路,具體實現鍊錶節點刪除操作時,需考慮節點的位置在頭結點、尾節點與非頭結點和尾節點時的三種情況。

我們具體分為:

(1)ptobedeleted不是多節點鍊錶的尾節點(此時用方法2的時間複雜度為o(1));

(2)ptobedeleted是多節點鍊錶的尾節點;

(3)ptobedeleted既是頭結點也是尾節點(即此時鍊錶中只有乙個節點),這時要注意將該節點刪除後,還要把鍊錶的頭結點設定為nullptr。

時間複雜度:總的平均時間複雜度是[(n-1)*o(1) + o(n)] / n = o(1)

**:

//定義節點

struct listnode

;//刪除鍊錶中的某個節點

void

deletenode

(listnode*

* plisthead, listnode* ptobedeleted)

//情況2:要刪除的節點是既是頭結點也是尾節點

elseif(

*plisthead == ptobedeleted)

//情況3:要刪除的節點是尾指標

else

pnode-

>next =

nullptr

;delete ptobedeleted;

ptobedeleted =

nullptr;}

}

題目二:刪除鍊錶中連續重複的節點

題目描述:

函式宣告為:

void

deleteduplication

(listnode*

* phead)

分析:

函式的輸入為要處理鍊錶的頭結點,需要考慮頭結點也可能與後面的節點重複。

每次將當前的節點與下乙個節點作比較,若重複則刪除當前的節點,讓被刪除節點的前乙個節點pprenode始終指向下乙個沒有重複的節點。

**:

#include

#include

#include

using

namespace std;

//定義節點

struct listnode

//結構體的建構函式};

//刪除重複的節點

void

deleteduplication

(listnode*

* phead)

//若重複節點為頭結點則還要移動頭結點

if(pprenode ==

nullptr

)*phead = pnext;

else

pprenode-

>next = pnext;

pnode = pnext;

}else

//若不重複則移動指標繼續判斷下乙個節點}}

//釋放鍊錶中new的指標

void

destroylist

(listnode* phead)

}//測試函式

void

test

(char

* testname, listnode*

* phead,

int* expectedvalues,

int expectedlength)

if(pnode ==

nullptr

&& index == expectedlength)

printf

("passed.\n");

else

printf

("failed.\n");

}//主函

intmain()

;test

("test1"

,&phead, expectedvalues,

sizeof

(expectedvalues)

/sizeof

(int))

;destroylist

(phead)

;return0;

}

筆記:

在c++中struct也是類,所以可通過new來新建節點。、

結構體中listnode(int x):value(x),next(null){}這個是結構體的建構函式,與類的建構函式相同,冒號後面的是初始化列表,也就是給成員value初始化為傳入的引數x,next初始化為null

劍指offer 面試題18 刪除鍊錶的節點

給定單向鍊錶的頭指標和乙個節點指標,定義乙個函式在o 1 時間內刪除該節點。鍊錶節點與函式的定義如下 public static class listnode 將要刪除節點的next節點直接複製到該節點上。刪除原先的next節點 public void deletenode listnode hea...

劍指Offer面試題18 刪除鍊錶的節點

刪除鍊錶的節點 struct listnode void deletenode listnode plisthead,listnode ptobedelete if ptobedelete next nullptr 要刪除的節點不是尾節點 else 要刪除的節點為尾節點 p next nullptr...

面試題18 劍指offer 刪除鍊錶的節點

題目一 在o 1 時間刪除鍊錶結點。給定單向鍊錶的頭指標和乙個結點指標,定義乙個函式在o 1 時間刪除該結點。思路 由於單向鍊錶只有next指標,要刪除給定節點必須要知道它的上乙個節點,通常會從頭遍歷複雜度為o n 不滿足題目,可以將給定節點的下乙個節點的值賦值給給定節點,然後刪除給定節點的下乙個節...