//给你一个链表的头节点 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。