題目二:刪除鍊錶中連續重複的節點
筆記:題目一:在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 不滿足題目,可以將給定節點的下乙個節點的值賦值給給定節點,然後刪除給定節點的下乙個節...