leetcode[203]移除链表元素 Java实现(注意移动node.next的时机,易错)

该博客讨论了如何在给定链表头节点和一个整数值的情况下,有效地删除链表中所有值等于该整数的节点。提供的解决方案是通过创建一个哑节点dummyHead作为新链表的头,然后遍历链表,当遇到值匹配的节点时,直接跳过,最终返回dummyHead.next作为新链表的头节点。时间复杂度为O(n),确保了每个节点只被访问一次。注意避免在删除节点后不必要的节点移动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
// 
//
// 示例 1: 
//
// 
//输入:head = [1,2,6,3,4,5,6], val = 6
//输出:[1,2,3,4,5]
// 
//
// 示例 2: 
//
// 
//输入:head = [], val = 1
//输出:[]
// 
//
// 示例 3: 
//
// 
//输入:head = [7,7,7,7], val = 7
//输出:[]
// 
//
// 
//
// 提示: 
//
// 
// 列表中的节点在范围 [0, 104] 内 
// 1 <= Node.val <= 50 
// 0 <= k <= 50 
// 
// Related Topics 链表 
// 👍 603 👎 0
 class ListNode {
     int val;
     ListNode next;
     ListNode() {}
     ListNode(int val) { this.val = val; }
     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 }


//leetcode submit region begin(Prohibit modification and deletion)
/**
 * Definition for singly-linked list.
// * 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) {
        ListNode dummyHead = new ListNode(0, head);
        ListNode node = dummyHead;
        while (node.next!=null){
            if (node.next.val == val){
                node.next = node.next.next;
            } else{  //这里容易出错,在else里才移动next
                node = node.next;
            }
        }
        return dummyHead.next;
    }
}
//leetcode submit region end(Prohibit modification and deletion)

时间复杂度最低也得是O(n),所以直接扫描一遍,用node.next = node.next.next;删除节点即可。

剑指offer中删除给定节点要求的时间复杂度是O(1),那时候才需要用后面元素的值覆盖当前节点值,再删后面元素的方法。这道题不需要这么麻烦,不要进入思维定式了。

另外注意node.next = node.next.next执行后,在下次循环中已经相当于执行过node = node.next了,不要重复移动node。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值