203. 移除链表元素
链表的删除正常情况下是需要知道前一个节点
(有一种题型是不需要知道前置结点 除了删除第一个节点与最后一个节点
可以用 current.val = current.next.val current.next = current.next.next )
方法一 没有虚拟头结点的链表删除
//ListNode 如下
public class ListNode {
public int val;
public ListNode next;
public ListNode(int x){
val = x;
}
}
public class Solution {
public ListNode removeElements(ListNode head, int val) {
//如果第一个节点就为要删除元素
while (head != null && head.val == val) {
head = head.next;
}
if (head == null) {
return null;
}
//删除节点
ListNode previous = head;
ListNode current = head.next;
while (current != null) {
if (current.val == val) {
previous.next = current.next;
current = current.next;
} else {
previous = current;
current = current.next;
}
}
return head;
}
}
方法二 有虚拟头结点的删除
ListNode dummyHead = new ListNode(-1);//虚拟头结点不访问
dummyHead.next = head;
ListNode prev = dummyHead;
while (prev.next != null) {
if (prev.next.val == val) {
prev.next = prev.next.next;
}else {
prev = prev.next;
}
}
return head;
}
方法三 递归
链表是一个天然的可以递归的结构
if (head == null) {
return null;
}
//递归求出所有的子链
ListNode res = removeElements(head.next, val);
//如果当前的头要被删掉 就不连接到子链上
if (head.val == val) {
return res;
}else {
head.next = res;
return head;
}
}
优化
if (head == null) {
return null;
}
//递归求出所有的子链
head.next = removeElements(head.next, val);
//如果当前的头要被删掉 就不连接到子链上
return head.val == val?head.next:head;
}