每日一练:LeeCode-203. 移除链表元素 【链表+虚拟头结点】
- 思路
- 设置虚拟头结点
本文是力扣 每日一练:LeeCode-203. 移除链表元素 【链表+虚拟头结点】 学习与理解过程,本文仅做学习之用,对本题感兴趣的小伙伴可以出门左拐LeeCode-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, 10^4]
内 1 <= Node.val <= 50
0 <= val <= 50
思路
链表操作的两种⽅式:
-
直接使⽤原来的链表来进⾏删除操作。
-
设置⼀个虚拟头结点在进⾏删除操作。
笔者后续链表相关的题目都用 设置⼀个虚拟头结点
设置虚拟头结点
return 头结点的时候,别忘了 return dummyNode->next, 这才是新的头结点
class Solution {
public ListNode removeElements(ListNode head, int val) {
if(head==null)return head;
ListNode dummyHead = new ListNode(-1); // 设置⼀个虚拟头结点
dummyHead.next = head; // 将虚拟头结点指向head,方便后面做删除操作
ListNode cur = dummyHead;
while(cur.next!=null){
if(cur.next.val==val){
cur.next = cur.next.next; //一句话,一定要保证删除cur.next,cur为待操作节点的前一个节点
}else{
cur = cur.next;
}
}
return dummyHead.next;
}
}
时间复杂度: O(n)
空间复杂度: O(1)