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

被折叠的 条评论
为什么被折叠?



