Easy-题目5: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.
题目大意:
删除单链表中指定节点。
题目分析:
把指定节点的值改成后面的值,并令其后继节点指向原后继节点的后继节点。
源码:(language:c)

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

成绩:
4ms,beats 0.52% 众数4ms,99.48%
Cmershen的碎碎念:
在数据结构课上,我们删除链表节点的方法是令其前驱节点指向后继节点。可是本题中只有当前节点,又是单链表,无法获得其前驱节点。这个问题困扰了我一段时间,但我发现还有value值可以利用,因此得出上述算法。
其实测试用例不完全,根据源码,Node->next是有可能为空的,再引用val和next有可能引发NPD异常。因此上述的ac代码不可以用于删除链表中最后一个节点。(dts大法好!!!(^__^) 嘻嘻……)

数据规模: 1000 -------------------------------------------------- 头部插入 - List: 0.00000117s, LinkedList: 0.00000074s 中间插入 - List: 0.00000088s, LinkedList: 0.00002900s 尾部插入 - List: 0.00000006s, LinkedList: 0.00000068s 数据规模: 5000 -------------------------------------------------- 头部插入 - List: 0.00000374s, LinkedList: 0.00000069s 中间插入 - List: 0.00000214s, LinkedList: 0.00017303s 尾部插入 - List: 0.00000006s, LinkedList: 0.00000069s 数据规模: 10000 -------------------------------------------------- 头部插入 - List: 0.00000725s, LinkedList: 0.00000070s 中间插入 - List: 0.00000414s, LinkedList: 0.00034301s 尾部插入 - List: 0.00000006s, LinkedList: 0.00000069s 数据规模: 20000 -------------------------------------------------- 头部插入 - List: 0.00001463s, LinkedList: 0.00000079s 中间插入 - List: 0.00000720s, LinkedList: 0.00060157s 尾部插入 - List: 0.00000005s, LinkedList: 0.00000056s 删除操作性能测试(修正版) ================================================================================ 数据规模: 1000 -------------------------------------------------- 头部删除 - List: 0.00000057s, LinkedList: 0.00000007s 操作次数: List=1000, LinkedList=10000 中间删除 - List: 0.00000023s, LinkedList: 0.00001184s 操作次数: 1000 尾部删除 - List: 0.00000009s, LinkedList: 0.00008054s 操作次数: List=1000, LinkedList=100 数据规模: 5000 -------------------------------------------------- 头部删除 - List: 0.00000246s, LinkedList: 0.00000020s 操作次数: List=5000, LinkedList=10000 中间删除 - List: 0.00000205s, LinkedList: 0.00014523s 操作次数: 1000 尾部删除 - List: 0.00000008s, LinkedList: 0.00043788s 操作次数: List=1000, LinkedList=100 数据规模: 10000 -------------------------------------------------- 头部删除 - List: 0.00000595s, LinkedList: 0.00000035s 操作次数: List=10000, LinkedList=10000 中间删除 - List: 0.00000453s, LinkedList: 0.00029068s 操作次数: 1000 尾部删除 - List: 0.00000008s, LinkedList: 0.00088393s 操作次数: List=1000, LinkedList=100 数据规模: 20000 -------------------------------------------------- 头部删除 - List: 0.00001540s, LinkedList: 0.00000037s 操作次数: List=10000, LinkedList=10000 中间删除 - List: 0.00000972s, LinkedList: 0.00058760s 操作次数: 1000 尾部删除 - List: 0.00000009s, LinkedList: 0.00183439s 操作次数: List=1000, LinkedList=100代码结果如上,中间插入和删除的列表方法的变化不明显,链表删除部分仍与理论结果有差距,修正代码
10-23
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值