leetdode:237

题目是237删除链表中的节点,描述如下:

请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点。传入函数的唯一参数为要被删除的节点。

这道题有趣的地方是只给了要被删除的节点,没有给要被删除的节点的上一个节点。这样就无法重新连接链表了。解法颇有点“杀人越货“的感觉,代码如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution
{
public:
    void deleteNode(ListNode *node)
    {
        node->val = node->next->val;
        auto tmp = node->next;
        node->next = tmp->next;
        delete tmp;
    }
};

提交执行用时超过73%的用户,空间超过69%的用户,前面那群人估计都是没删除节点的,233。

为什么说是“杀人越货”,因为程序删掉的并不是链表中的给定节点,而是链表给定节点的下一个节点。这也是题干提示非末尾的原因。删除后给定链表的下一个节点其实是给定节点“假装”的,这里可以用12345的链表做一个例子:

链表为1,2,3,4,5,删去元素为3
start:
1->2->3->4->5
a->b->c->d->e
node->val = node->next->val
1->2->4->4->5
a->b->c->d->e
auto tmp=node->next
1->2->4->4->5
a->b->c->d->e
tmp------^
node->next=tmp->next
1->2->4->5
a->b->c->e
tmp->3
tmp->d
delete tmp;
1->2->4->5
a->b->c->e

理论上被删掉的应该是节点c,实际上删除的是节点d,由原来的节点c“假装”节点d,所以叫”杀人越货“,233

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 题目汇总https://leetcode-cn.com/tag/linked-list/剑指 Offer 18. ...
    今天柚稚了么阅读 2,490评论 0 0
  • 1.链表 1.实现一个单向链表 2.找出链表相交节点,假设均没有环 3.判断链表是否有环思路:使用快慢两个指针,当...
    X1028阅读 3,923评论 0 0
  • 请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点。 现有一个链表 --he...
    雪上霜阅读 760评论 0 0
  • leetcode:83 给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。 示例1:输入: 1->1-...
    二木二三水阅读 1,930评论 1 1
  • 今天感恩节哎,感谢一直在我身边的亲朋好友。感恩相遇!感恩不离不弃。 中午开了第一次的党会,身份的转变要...
    余生动听阅读 13,586评论 0 11