首页 > 试题广场 >

删除链表的节点

[编程题]删除链表的节点
  • 热度指数:65545 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解

给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。

1.此题对比原题有改动
2.题目保证链表中节点的值互不相同
3.该题只会输出返回的链表和结果做对比,所以若使用 C 或 C++ 语言,你不需要 free 或 delete 被删除的节点

数据范围:
0<=链表节点值<=10000
0<=链表长度<=10000
示例1

输入

{2,5,1,9},5

输出

{2,1,9}

说明

给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 2 -> 1 -> 9   
示例2

输入

{2,5,1,9},1

输出

{2,5,9}

说明

给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 2 -> 5 -> 9   

说明:本题目包含复杂数据结构ListNode,点此查看相关信息
function deleteNode( head ,  val ) {
    if(!head) return null;
    let root = head,prev=null,cur=head;
    while(cur){
        if(cur.val ===val){
            if(!prev){
                root = root.next;break;
            }
            prev.next = cur.next;break;
        }   
        prev = cur;
        cur= cur.next;
    }
    return root;
}

发表于 2022-08-28 13:08:21 回复(0)

解题思路:
循环查找是否相等,当满足删除条件(链表当前节点=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循环找出相同节点的部分代码。

发表于 2022-02-21 15:08:59 回复(0)
function deleteNode( head ,  val ) {
    // write code here
    if (head === null) return null;
    let res = head;
    if (head.val === val) return head.next
    while (head.next.val !== val) {
        head = head.next
    }
    head.next = head.next.next
    return res
}
发表于 2021-12-07 19:22:55 回复(0)