题目:
https://leetcode-cn.com/problems/remove-linked-list-elements/
题解一:
开辟一条新链表,遍历旧链表把符合要求的节点依次添加到新链表上,最后返回新链表的头节点,时间复杂度:O(n)。
public ListNode removeElements(ListNode head, int val) {
ListNode newHead = new ListNode();
ListNode node = newHead;
while (head != null) {
if (head.val != val) {
node.next = new ListNode(head.val);
node = node.next;
}
head = head.next;
}
return newHead.next;
}
这里引入了一个哨兵节点newHead,这个节点是我们自己创建了,真正的头节点应该是newHead.next。当然也可以把哨兵节点直接放到原链表头部,直接操作一条链表,这样内存消耗会小一点。
题解二:
递归求解,时间复杂度:O(n)。
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;
}
这道题递归的思路是从链表尾部开始删除元素,直到遍历到链表头部。