递归图解 :
方法一 递归:
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;
}
方法二:
public ListNode removeElements(ListNode head, int val) {
//头结点不为空且头结点的值为val,只有一个头节点
while(head != null && head.val == val){
ListNode node = head;
head = head.next;
node.next = null;
}
//空链表
if(head == null){
return null;
}else{
//从头prev开始寻找val
ListNode prev = head;
//多个节点
while(prev.next != null){
if(prev.next.val == val){
ListNode node = prev.next;
prev.next = node.next;
node.next = null;
}else{
prev = prev.next;
}
}
}
return head;
}
方法三 虚拟头结点法:
public ListNode removeElements(ListNode head, int val) {
ListNode dummyNode = new ListNode(-1);
dummyNode.next = head;
ListNode prev = dummyNode;
while (prev.next != null){
if(prev.next.val == val){
ListNode node = prev.next;
prev.next = node.next;
node.next = null;
}else{
prev = prev.next;
}
}
return dummyNode.next;
}