LeetCode 203删除链表元素

本文介绍了一种从链表中删除所有等于给定值节点的方法。提供了两种解法,一是直接修改原链表,二是引入虚拟头节点简化流程。

问题描述

删除链表中等于给定值 val 的所有节点。

示例:

输入: 1->2->6->3->4->5->6, val = 6
输出: 1->2->3->4->5

解法

解法思想

    此题删除链表中元素是很简单的,只需要让待删节点之前一个节点指向待删节点之后一个节点即可。
    这里我们讨论两种解法。
    在java中定义单链表的代码如下:
  public class ListNode {
        int val;
        ListNode next;
        ListNode() {}
        ListNode(int val) {this.val = val; }
        ListNode(int val, ListNode next) {this.val = val; this.next = next; }
    }

解法一

直接适用原来的链表来进行删除操作,这里存在一个问题,移除头节点和移除其他节点的操作是不一样的,因为链表的其他节点都是通过前一个节点来移除当前节点,而头结点没有前一个节点。所以头结点如何移除呢,其实只要将头节点向后移动一位就可以,这样就从链表中移除了一个头节点。

class Solution {
    public ListNode removeElements(ListNode head, int val) {
        //这个是不设置虚拟头节点的解法,要删除的元素需要讨论是不是头节点
        //删除头节点
        while (head != null && head.val == val) { //注意这里不是if,因为有可能出现前好几个都是val的情况 要是if只能删除一个
            head = head.next;
        }
        //删除非头节点
        ListNode cur = head; //遍历节点,初始值为头节点
        while (cur != null && cur.next != null) { //后边这个条件是保证cur.next.next有意义
            if (cur.next.val == val) {
                cur.next = cur.next.next;
            }
            else {
                cur = cur.next;
            }
        }
        return head;
    }
}

解法二

解法一中的删除节点对不同的删除节点有不同的操作,可不可以以一种统一的逻辑来移除链表的节点呢?
我们可以***设置一个虚拟头节点dummyHead***,这样原链表的所有节点就都可以按照统一的方式进行移除了。

class Solution {
    public ListNode removeElements(ListNode head, int val) {
        ListNode dummyHead = new ListNode(0); //设置一个虚拟头节点
        dummyHead.next = head;
        ListNode prev = dummyHead; //遍历节点的上一个节点,初始值为虚拟头节点
        ListNode curr = head; //当前的遍历节点,初始值为头节点
        while (curr != null) {
            if (curr.val == val) {
                prev.next = curr.next;
            }
            else{
                prev = curr;
            }
            curr = curr.next;
        }
        return dummyHead.next; //不返回head的原因是有可能删除掉了初始的head
    }
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值