203 移除链表元素
给你一个链表的头节点 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 <= val <= 50
思路
-
这是一道入门级别的链表题,考察的是我们删除和遍历链表的能力
-
删除节点的方法非常简单,op.next = op.next.next
-
这样就完成了节点的删除
-
但是出现了一个问题:头节点无法删除
-
因为我们正常的链表是从头节点开始遍历的,我们用的删除的方法都是在删除的节点的上一个来帮助我们删除,但是头节点是我们链表的第一个,所以我们正常无法删除头节点
-
这里,我们引入一个虚拟头节点 dummyNode dummy是哑的意思,这个就代表他在我们的链表中,但是不说话,我们平时不知道他的存在,需要使用的时候才会用他
-
我们让我们的虚拟头节点担任我们链表的首位元素,这样之前的头节点就和别的节点一视同仁了,我们可以轻松的进行删除
-
删除解决了,现在我们还要解决遍历,在创建一个虚拟头节点的副本 op ,用op来遍历链表,为什么不用我们的dummynode呢?因为我们还需要他来帮我们return 出链表的头元素,所以我们不改变它的值,op来遍历链表,如果val == target ,那么就跨过这个节点,否则,op = op.next;直到遍历结束
class Solution { public ListNode removeElements(ListNode head, int val) { ListNode dummynode = new ListNode(-1); dummynode.next = head; ListNode op = dummynode; while(op.next!=null) { if(op.next.val==val) { op.next = op.next.next; }else { op = op.next; } } return dummynode.next; } }