请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点。
现有一个链表 -- head = [4,5,1,9],它可以表示为:
示例 1:
输入: head = [4,5,1,9], node = 5
输出: [4,1,9]
解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.
看到题目的第一眼以为时要从前往后遍历找那个要删除的节点,然后让那个节点的前一个节点指向要删除的节点的后一个节点,这样就删除了这个节点,可没想到不是这么一回事,而且还就给定了一个参数,
var deleteNode = function(node) {
};
这不得最少需要两个参数吗?要删除的listnode,还有要删除第几个吧,懵逼,骂骂咧咧开始找答案。。。
var deleteNode = function(node) {
node.val = node.next.val;
node.next = node.next.next;
};
把当前节点的data换成下一节点的data,链接地址换成下下一节点的链接地址,画图理解一下。
这能把当前的节点删除吗?明明删除的是当前节点的下一个节点啊。。。而且有的语言像c++好像没有垃圾回收机制吧,那这么写了根本都没有删除节点还得加个delete吧。
var deleteNode = function(node) {
let del = node.next
node.val = node.next.val;
node.next = node.next.next;
delete del
};
我个人的理解是,之前删除节点都是给定一个链表ListNode,和要删除的数据,然后通过遍历来找那个要删除的数据,这次是直接给你定位到了那个要删除的节点,你不用再通过遍历来找了,也就不需要别的参数了,直接有node自身节点来搞定。
最终:
var deleteNode = function(head, val) { if(!head) return head //判断待删除的节点是否是头结点 if(head.val === val) return head.next let pre = null let deleteNode = head // 指针向后移动,寻找待删除的节点 while(deleteNode.val !== val) { pre = deleteNode deleteNode = deleteNode.next } // 通过更新指针来移除待删节点 // 待删节点的前置节点的指针指向待删除节点的后一个节点 pre.next = pre.next.next return head };