237 刪除鍊錶中的節點

2021-10-06 03:39:03 字數 2184 閱讀 8106

請編寫乙個函式,使其可以刪除某個鍊錶中給定的(非末尾)節點,你將只被給定要求被刪除的節點。

現有乙個鍊錶 –head = [4,5,1,9],它可以表示為:

示例 1:

輸入: head =[4

,5,1

,9], node =

5輸出:[4

,1,9

]解釋: 給定你鍊錶中值為 5 的第二個節點,那麼在呼叫了你的函式之後,該鍊錶應變為 4

->

1->

9.

示例 2:

輸入: head =[4

,5,1

,9], node =

1輸出:[4

,5,9

]解釋: 給定你鍊錶中值為 1 的第三個節點,那麼在呼叫了你的函式之後,該鍊錶應變為 4

->

5->

9.

c的函式原型:

void

deletenode

(struct listnode* node)

void

deletenode

(struct listnode* node)

}

這題和一般鍊錶刪除結點情況不同。

通常鍊錶刪除結點是通過待刪除結點前乙個結點,來檢測刪除哪乙個結點,對於前乙個結點它的next指標直接指向要刪除結點的下乙個結點,把要刪除的這個結點跨過去即可。

如,刪除結點3

通常會通過3前面的2來定位,而後會把指向2cur指標指向4,跨過3

這道題不太一樣,直接給定3這個結點,我們無法獲取2這個結點的資訊。

咋辦?我們可以動的就只有當前結點的指標。

把後面的值賦值過來,再刪除掉後面的指標即可。

void

deletenode

(struct listnode* node)

node->val = node->next->val;

// 用下乙個值覆蓋

struct listnode* del_node = node->next;

node->next = node->next->next;

free

(del_node)

; del_node =

null

;// free指標後,指標的值是乙個隨機值,為防止野指標,重新初始化

}

在物件導向的語言中,已知node但無法訪問node的上乙個節點,因此不能修改上乙個節點的next屬性。

於是得把node節點的值用下乙個節點的值去覆蓋掉,然後把重複值的node.next給刪除掉也可以實現刪除結點。

但在c語言中,因為是指標和結構體來表示鍊錶,因此node和之前節點的next指向了記憶體中的同一位址,所以只要對這個位址做修改,上乙個節點的next也同時被修改了。

*node = *(node->next);

完整**:

void

deletenode

(struct listnode* node)

237 刪除鍊錶中的節點

請編寫乙個函式,使其可以刪除某個鍊錶中給定的 非末尾 節點,你將只被給定要求被刪除的節點。現有乙個鍊錶 head 4,5,1,9 它可以表示為 4 5 1 9示例 1 輸入 head 4,5,1,9 node 5 輸出 4,1,9 解釋 給定你鍊錶中值為 5 的第二個節點,那麼在呼叫了你的函式之後,...

237 刪除鍊錶中的節點

請編寫乙個函式,使其可以刪除某個鍊錶中給定的 非末尾 節點,你將只被給定要求被刪除的節點。現有乙個鍊錶 head 4,5,1,9 它可以表示為 示例 1 輸入 head 4,5,1,9 node 5 輸出 4,1,9 解釋 給定你鍊錶中值為 5 的第二個節點,那麼在呼叫了你的函式之後,該鍊錶應變為 ...

237刪除鍊錶中的節點

請編寫乙個函式,使其可以刪除某個鍊錶中給定的 非末尾 節點,你將只被給定要求被刪除的節點。現有乙個鍊錶 head 4,5,1,9 它可以表示為 示例 1 輸入 head 4,5,1,9 node 5 輸出 4,1,9 解釋 給定你鍊錶中值為 5 的第二個節點,那麼在呼叫了你的函式之後,該鍊錶應變為 ...