劍指offer 18 刪除鍊錶的結點

2021-09-19 12:04:57 字數 1535 閱讀 7264

typedef   int datatype;

typedef struct listnode listnode;

//建立結點

static listnode *createnode(datatype data)

//鍊錶初始化

void listinit(listnode **ppfirst)

//鍊錶銷毀

void listdestory(listnode **ppfirst)

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

這道題的思路分為三步:

(1)如果要刪除結點i,先把i的下乙個結點j的內容複製到i,然後把i的指標指向結點j的下乙個結點,此時再刪除結點j,其效果剛好是把結點i刪除了(如圖);

(2)對於尾結點,從頭結點開始遍歷找到為結點的前乙個結點,然後完成刪除操作;如果鍊錶中只有乙個結點,即刪除頭結點,刪除之後把鍊錶的頭結點置為null;

(3)對於n-1個非尾結點,可以在o(1)時把這個結點刪除;對於尾結點,由於要遍歷查詢,它的時間複雜度為o(n);因此總的平均時間複雜度為[(n-1)*o(1)+o(n)]/n,結果還是o(1);

**如下:

void deletenode(listnode **phead, listnode *pdelete)

//刪除頭結點

else if (*phead == pdelete)

//刪除尾結點

else

pnode->next = null;

free(pdelete);

pdelete = null;

}}

題目二:在乙個排序的鍊錶中,刪除掉重複的結點。

定義乙個pnode指標來儲存當前結點,pnext儲存當前結點的下乙個結點,ppre儲存當前結點的前乙個結點。從頭遍歷整個鍊錶,如果pnext->data == pnode->data,那麼證明它們就是重複的結點,刪除它們即可(將pnode賦值給pdeletenode,刪除pdeletenode和pdeletenode->next兩個結點,刪除完畢後pnext=pdeletenode->next->next),此時pnext中儲存的是刪除結點後面的那個結點,然後通過 ppre->next = pnext以保證刪除之後鍊錶依然是相連的。

**如下:

void deleterepetition(listnode **phead)

listnode *ppre = null;

listnode *pnode = *phead;

while (pnode != null)

if (!needdelete)

else

if (ppre == null)

else

pnode = pnext;

} }}

劍指offer18 刪除鍊錶節點

1.考慮輸入空鍊錶和乙個節點鍊錶 2.如果頭節點不重複,直接遞迴查詢重複 3.雙指標,進行判斷兩個節點是不是相等 coding utf 8 class listnode def init self,x self.val x self.next none class solution def dele...

劍指offer 18 刪除鍊錶的節點

描述 給定單向鍊錶的頭指標和乙個要刪除的節點的值,定義乙個函式刪除該節點。返回刪除後的鍊錶的頭節點。示例 輸入 head 4,5,1,9 val 5 輸出 4,1,9 解釋 給定你鍊錶中值為 5 的第二個節點,那麼在呼叫了你的函式之後,該鍊錶應變為 4 1 9.常規思路 定義乙個暫時變數用來刪除節點...

劍指offer 18 刪除鍊錶的節點

給定單向鍊錶的頭指標和乙個要刪除的節點的值,定義乙個函式刪除該節點。返回刪除後的鍊錶的頭節點。注意 此題對比原題有改動 示例 1 輸入 head 4,5,1,9 val 5 輸出 4,1,9 解釋 給定你鍊錶中值為 5 的第二個節點,那麼在呼叫了你的函式之後,該鍊錶應變為 4 1 9.示例 2 輸入...