虚拟头结点法
/**
* 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 virtHead = new ListNode(0);
virtHead.next = head;
// 该结点用于遍历整个链表,起始位置是虚拟头结点,因为 head 结点的值也可能为 val
ListNode node = virtHead;
while(node.next != null){
// 记录 node 的下一个结点,用于进行删除操作
ListNode next = node.next;
if(next.val == val){
node.next = next.next;
// 保证下一个等于 val 的结点能继续删除
continue;
}
// 遍历所有结点
// 这里最好写在 else 里
node = node.next;
}
// 返回原头结点
return virtHead.next;
}
}
- 空间复杂度:O(1)
- 时间复杂度:O(n)
头结点单独处理
class Solution {
public ListNode removeElements(ListNode head, int val) {
ListNode node = head;
// 如果头结点值等于 val,修改头结点为 next,直到头结点不等于 val
while(node != null && node.val == val){
head = node.next;
node = head;
}
while(node != null && node.next != null){
ListNode next = node.next;
if(next.val == val){
node.next = next.next;
} else {
node = node.next;
}
}
return head;
}
}
- 空间复杂度:O(1)
- 时间复杂度:O(n)
递归
class Solution {
public ListNode removeElements(ListNode head, int val) {
if(head == null) return null;
head.next = removeElements(head.next, val);
return head.val == val? head.next: head;
}
}
用递归法一定要定义好终止条件,以及想清楚返回值
- 空间复杂度:O(n)
- 时间复杂度:O(n)