题目
Remove all elements from a linked list of integers that have value val.
Example:
Input: 1->2->6->3->4->5->6, val = 6
Output: 1->2->3->4->5
解法思路
- 首先要对传入的头节点
head
做判断,是不是不为空?是不是就是和要删除的值相等?如果是的话,那么就要删除头节点;这个动作一直做,直到头节点不再是要删除的节点,或者链表已经被删没了; - 如果链表在上述动作中删没了,那么就向外返回 null;
- 如果链表没有被删没,那么就从头节点的后继节点开始遍历,判断是否应该被删除;
- 在删除完链表中所有要删除的元素后,返回头节点;
解法实现
时间复杂度
- O(N);
空间复杂度
- O(1);
关键字
链表
删除链表中的元素
实现细节
- 注意对头节点的判断;
package leetcode._203;
public class Solution203_1 {
public ListNode removeElements(ListNode head, int val) {
while (head != null && head.val == val) {
ListNode delNode = head;
head = delNode.next;
delNode.next = null;
}
if (head == null) {
return null;
}
ListNode prev = head;
while (prev.next != null) {
if (prev.next.val == val) {
ListNode delNode = prev.next;
prev.next = delNode.next;
delNode.next = null;
} else {
prev = prev.next;
}
}
return head;
}
}
解法思路(二)
- 在链表的头节点前链入一个虚拟头节点,这样就无须对头节点的情况做单独的判断和处理;
解法实现(二)
时间复杂度
- O(N);
空间复杂度
- O(1);
关键字
虚拟头节点
链表
删除链表中的元素
实现细节
// 203. Remove Linked List Elements
// https://leetcode.com/problems/remove-linked-list-elements/description/
// 使用虚拟头结点
// 时间复杂度: O(n)
// 空间复杂度: O(1)
public class Solution2 {
public ListNode removeElements(ListNode head, int val) {
// 创建虚拟头结点
ListNode dummyHead = new ListNode(0);
dummyHead.next = head;
ListNode cur = dummyHead;
while(cur.next != null){
if(cur.next.val == val ){
ListNode delNode = cur.next;
cur.next = delNode.next;
}
else
cur = cur.next;
}
return dummyHead.next;
}
public static void main(String[] args) {
int[] arr = {1, 2, 6, 3, 4, 5, 6};
int val = 6;
ListNode head = new ListNode(arr);
System.out.println(head);
(new Solution1()).removeElements(head, val);
System.out.println(head);
}
}