给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。
1.此题对比原题有改动
2.题目保证链表中节点的值互不相同
3.该题只会输出返回的链表和结果做对比,所以若使用 C 或 C++ 语言,你不需要 free 或 delete 被删除的节点
数据范围:
0<=链表节点值<=10000
0<=链表长度<=10000
给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。
{2,5,1,9},5
{2,1,9}
给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 2 -> 1 -> 9
{2,5,1,9},1
{2,5,9}
给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 2 -> 5 -> 9
解题思路:
循环查找是否相等,当满足删除条件(链表当前节点=val)时,执行链表删除操作,注意边界条件和特殊情况的处理。
方法1:
function deleteNode( head , val ) { // write code here // 先处理特殊情况,即头结点就是所需要删除的值,则直接将头结点赋值为next // 为什么要特殊处理这个情况?因为带入到普通处理的while循环中,执行情况为: // 第一次带入,则不满足条件,不会执行while循环,接入向下执行pre.next=cur.next, // 执行结果即为,null的next节点为第二个节点,不符合单链表规则 // 代码书写中,一定要注意特殊情况和边界条件 if(head.val===val) return head=head.next //设置一个pre前节点,以便删除操作 var pre=null var cur=head while(cur.next){ // 比较相同,删除节点 if(cur.val==val){ // 将前一个节点的next直接连接到下一个节点,达到了删除cur节点的效果 pre.next=cur.next // break跳出循环 break; } // 一定要注意赋值顺序!!! pre=cur cur=cur.next; } return head; } module.exports = { deleteNode : deleteNode };
方法2:
function deleteNode( head , val ) { // write code here // 先处理特殊情况,即头结点就是所需要删除的值,则直接将头结点赋值为next // 为什么要特殊处理这个情况?因为带入到普通处理的while循环中,执行情况为: // 第一次带入,则不满足条件,不会执行while循环,接入向下执行pre.next=cur.next, // 执行结果即为,null的next节点为第二个节点,不符合单链表规则 // 代码书写中,一定要注意特殊情况和边界条件的处理 if(head.val===val) return head=head.next //设置一个pre前节点,以便删除操作 var pre=null var cur=head // 链表当前值 与val值不相等时,一直向下找 while(cur.val!=val){ pre=cur; cur=cur.next; } // 跳出循环向下执行,说明,链表当前值与val相等,执行链表删除操作 pre.next=cur.next; return head; } module.exports = { deleteNode : deleteNode };
两种方法的区别在于,while循环找出相同节点的部分代码。