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。

比如:1->2->3->4,调用 deleteNode(第二个节点),变成1->3->4

等效为:

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.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值