題目
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
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.