天天看點

Leetcode——237. Delete Node in a Linked List

題目

Write a function to delete a node (except the tail) in a singly linked list, given only access to that node.

Supposed the linked list is 1 -> 2 -> 3 -> 4 and you are given the third node with value 3, the linked list should become 1 -> 2 -> 4 after calling your function.

解答

就是寫一個删除目前節點的函數。

這題很有意思!

我們不能删除目前節點,但是可以做到把後面那個節點賦給目前的節點,然後把目前節點指向下下個節點。

Discuss裡給的解答:

void deleteNode(ListNode* node) {
    *node = *node->next;
}
           

這一行代碼,我一直沒看明白!但是确實是起作用的。原作者的解釋是,這一行代碼是把node->next這個節點以及之後的所有資料都賦給node。

比如:->->->,調用 deleteNode(第二個節點),變成->->
           

等效為:

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

其實上述過程中,記憶體中還是有3->4

Leetcode——237. Delete Node in a Linked List

3->4在程式運作結束,由系統釋放!

下面這個解法(上圖右邊解法)

void deleteNode(ListNode* node) {
    auto next = node->next;
    *node = *next;
    delete next;
}
           

是删除3這個節點,但是删之前把3賦給2了。

Discuss的精彩讨論:

https://discuss.leetcode.com/topic/18752/1-3-lines-c-java-python-c-c-javascript-ruby

->優先級高于*

*node = *node->next;
It is *(node->next), not (*node)->next.