請編寫乙個函式,使其可以刪除某個鍊錶中給定的(非末尾)節點,你將只被給定要求被刪除的節點。
現有乙個鍊錶 –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
來定位,而後會把指向2
的cur
指標指向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 的第二個節點,那麼在呼叫了你的函式之後,該鍊錶應變為 ...