题目
给你一个链表的头节点 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
思路
此题的移除操作,就是让节点next指针直接指向下下一个节点就可以了,但如果val元素在链表中间,确实是很容易,但是因为单链表的特殊性,只能指向下一个节点,如果删除的是头结点又该怎么办呢?
这里就涉及如下链表操作的两种方式:
- 直接使用原来的链表来进行删除操作。
- 设置一个虚拟头结点在进行删除操作。
先看第一种解法:
移除头结点和移除其他节点的操作是不一样的,因为链表的其他节点都是通过前一个节点来移除当前节点,而头结点没有前一个节点。
所以头结点如何移除呢?只需要将头节点向后移动一位,如此一来,链表中就移除了一个头结点
我们再来看第二种解法:
设置虚拟头结点
给链表添加一个虚拟头结点为新的头结点,此时要移除这个旧头结点元素,直接让虚拟头结点指向下一个元素。
当然return 头结点的时候,别忘了 return dummyNode->next;, 这才是新的头结点。
题解
class Solution {
public ListNode removeElements(ListNode head, int val) {
while(head != null && head.val==val){
head= head.next;
}
ListNode prev = head;
if(prev!=null){
while(prev.next!=null){
if(prev.next.val==val){
prev.next=prev.next.next;
}else{
prev=prev.next;
}
}
}
return head;
}
}
class Solution {
public ListNode removeElements(ListNode head, int val) {
if(head == null){
return head;
}
ListNode dummyHead = new ListNode(-1, head);
ListNode pre = dummyHead;
ListNode cur = head;
while(cur != null){
if (cur.val == val) {
pre.next = cur.next;
} else {
pre = cur;
}
cur = cur.next;
}
return dummyHead.next;
}
}
|