73 - 删除列表中的节点
Last updated
Was this helpful?
Last updated
Was this helpful?
请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点。
现有一个链表 -- head = [4,5,1,9],它可以表示为:
示例 1:
输入: head = [4,5,1,9], node = 5 输出: [4,1,9] 解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.
示例 2:
输入: head = [4,5,1,9], node = 1 输出: [4,5,9] 解释: 给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9.
说明:
链表至少包含两个节点。
链表中所有节点的值都是唯一的。
给定的节点为非末尾节点并且一定是链表中的一个有效节点。
不要从你的函数中返回任何结果。
这。。感觉好简单啊
就遍历一下,一边遍历一边留一下之前的节点,如果遇到了要删除的,就牵线一下pre和next。。
然后发现。。它只给一个需要删除的node节点。。这样就访问不到之前的节点,并且还要把自己删掉
起码我不知道该怎么写测试代码了。😂😂
官方题解说,把自己的val复制一份,把自己的指针指向下下节点。。假装删了自己,其实是戴着下一个人的面具,把下一个人删了,狸猫换太子。。
Runtime: 0 ms, faster than 100.00% of Go online submissions forDelete Node in a Linked List.
Memory Usage: 2.9 MB, less than 100.00% of Go online submissions for Delete Node in a Linked List.
Runtime: 68 ms, faster than 29.56% of JavaScript online submissions for Delete Node in a Linked List.
Memory Usage: 36 MB, less than 16.67% of JavaScript online submissions for Delete Node in a Linked List.
作者:chitanda-eru
js里面还有更简单的方法:
Runtime: 60 ms, faster than 77.93% of JavaScript online submissions for Delete Node in a Linked List.
Memory Usage: 35.7 MB, less than 33.33% of JavaScript online submissions for Delete Node in a Linked List.
js的对象都是内存引用,也就是说node这个变量里面,只保留了内存地址,相当于go中的&node
。
而这个题解中的做法node = node.next
是不行的,因为这仅仅改变了node的指针指向,让node
指向了node.next
的内存地址。即node
和node.next
都指向了同一个地方。
Object.assign()
则是合并两个对象,并覆盖第一个参数所指的地址上。
在这里,就是把node
和node.next
合并,并存到node
所指的内存地址上。合并即相同的属性由node.next
覆盖node
,不同的属性都加到node
上。
如果前面加一个变量,那么这个变量会和node
所指的内存地址一样。如:var c = Object.assign(node, node.next)
,那么c指向的是node的地址。改了其中一个,另一个也会改。
评论里的深浅拷贝,可能理解有错。这两者都是浅拷贝。
所谓深拷贝,是连对象里套的对象也拷贝了,那才叫足够的深,不是么。就好像var a = {a:1, b:{c:2}}
。深拷贝后,改变了最里面的c,打印a的时候,c也依然会是2。
笑死:
链接: