题目是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