【算法笔记】移除链表元素

移除链表元素问题

给你一个链表的头节点head和一个整数val ,请你删除链表中所有满足Node.val == val的节点,并返回新的头节点 。

问题分析

一个很简单的链表删除操作,通过头结点不断向后面的结点移动,比较每一个结点是否等于val,是就执行链表的删除操作。

原链表直接解决问题

我们需要注意的是头结点的删除方式和其他结点的不同

  • 删除头结点:head=head.next 直接让头结等于下一个节点
  • 删除非头结点(A.next):A.next=A.next.next 该节点的上一个节点的指针域指向该节点的下一个节点

此问题为单链表,在java中的定义为

class ListNode {
    int val;  //节点元素
    ListNode next; //节点指针域
    
    //下面为节点的三种构造方式
    ListNode() {
    }

    ListNode(int val) {
        this.val = val;
    }

    ListNode(int val, ListNode next) {
        this.val = val;
        this.next = next;
    }
}

具体代码

    //直接解法
    public ListNode removeElements1(ListNode head, int val) {
        //删除头结点
        while(head!=null&&head.val==val){
            head=head.next;
        }

        ListNode pointer=head; //用于删除操作的指针
        while(pointer!=null&&pointer.next!=null){
            //如果结点值等于val删除这个结点
            if(pointer.next.val==val){
                pointer.next=pointer.next.next;
            }
            else {
                pointer=pointer.next;  //指针向下一个节点移动
            }
        }
        //返回头结点
        return head;
    }

设置虚拟头结点解决问题

常规的操作手段需要我们将头结点与非头结点分开处理,那么在原本的头结点前增加一个节点,这样就不存在删除头结点的问题了,就可以去掉单独处理头结点的逻辑,最后返回增加头结点的下一个节点就是原链表的最终头节点了。
这个增加的头结点通常叫做虚拟头结点。
具体代码

    //采用虚拟头结点
    public ListNode removeElements(ListNode head, int val) {
        ListNode dummyHead=new ListNode(0); //创建虚拟头结点
        dummyHead.next=head;  //虚拟头结点的指针指向头结点

        ListNode pointer=dummyHead; //用于删除操作的指针
        // 删除结点
        while(pointer!=null&&pointer.next!=null){
            //如果结点值等于val删除这个结点
            if(pointer.next.val==val){
                pointer.next=pointer.next.next;
            }
            else {
                pointer=pointer.next;  //指针向下一个节点移动
            }
        }


        //返回实际头结点,虚拟头结点的下一个节点
        return dummyHead.next;
    }
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值