LeetCode203移除链表元素两种实现方法(Java实现)

今天来分享的是移除链表元素的题目。
题目描述如下。
在这里插入图片描述
那么本道题目操作的是单链表,需要注意的是,单链表只能顺序通过next访问数组中的元素。
实现方法1:不使用虚拟节点进行求解
不使用虚拟节点我们在处理头结点需要进行判断,如果要删除的元素是头结点,那么我们此时让head=head.next
如果删除的不是头结点,那么就让head.next=head.next.next即可删除元素。
那么具体呢,我们来结合代码进行讲解下。
代码如下:

class Solution {
    public ListNode removeElements(ListNode head, int val) {

 while (head!=null&&head.val==val){
            head=head.next;
        }
        //将头结点赋值给cur,操作的是cur不要直接操作head节点。
        ListNode cur=head;
        //特别说明,这里定义cur要指向的是head,而不是head.next
//        如果定义的cur=head.nextd的话,那么此时发现被删除的元素是head,这样就无法对head节点进行操作。
//        单链表是没有办法操作前一个元素

        //循环结束条件是链表为空
        while (cur!=null){
            //如果删除的元素的值与目标值相同
            while (cur.next!=null&&cur.next.val==val){
                //将cur.next指向cur.next.next完成删除操作
                cur.next=cur.next.next;
            }
            //如果没有找到目标元素,cur向后移动
               cur=cur.next;
        }
        return head;



    }
}

具体的需要注意的事项和点,我写在了上面的代码注释部分大家可以看着理解一下。
方法2:使用一个虚拟节点解题
在这里我们定义一个虚拟节点VirNode,并让VirNode的next指向头节点head,这样就可以完成对头结点和其它节点一致的操作,而不需要像方法1一样要特别对head节点进行一个判断。
具体代码实现如下:

/**
     * 使用虚拟节点
     */
    //定义虚拟节点
    ListNode VirNode = new ListNode();
    //虚拟节点的next指向head结点
    VirNode.next = head;
    //定义节点指向VirNode不要操作VirNode
    ListNode node = VirNode;
    //循环中止条件是node.next为空
    while (node.next != null) {
        //如果找到要删除的元素, node.next指向node.next.next
        if (node.next.val == target) {
            node.next = node.next.next;
        } else {
            //没有找到要删除的元素,node向后移
            node = node.next;
        }
        //这里需要注意的是不可以将node=node.next写在else判断外面,这样会导致
        //找到和未找到删除的元素,node都会向后移动,这样就不是我们想要达到的效果

    }
    //最后返回的是VirNode.next,而不是head,因为head可能会被删除,这样就无法定位到head的位置
    //而VirNode.next是我们指向的新的头结点。
    return VirNode.next;

那么具体的代码和思路在我的上述代码中进行了一个i详细的描述如果大家觉得有问题可以在下方留言,博主看到会进行解答,觉得博主写的不错的麻烦给一个小小的❤学习O(∩_∩)O!

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值