LeetCode 203
删除链表中等于给定值 val 的所有节点。
示例:
输入: 1->2->6->3->4->5->6, val = 6
输出: 1->2->3->4->5
1.不适用虚拟头结点
private class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}
public ListNode removeElement1(ListNode head,int val) {
//删除满足条件的头节点 while表示连续满足
while (head != null && head.val == val) {
ListNode delNode = head;
head = head.next;
delNode.next = null;
}
//删除完满足条件的节点为空后 直接返回null
if (head == null) {
return null;
}
//将当前的head节点当前虚拟节点进行遍历
ListNode pre = head;
while (head.next != null) {
if (head.next.val == val) {
ListNode delNode = pre.next;
pre.next = delNode.next;
delNode.next = null;
} else {
pre = pre.next;
}
}
return head;
}
//简化后的方法
public ListNode removeElement2(ListNode head,int val) {
//删除满足条件的头节点 while表示连续满足
while (head != null && head.val == val) {
head = head.next;
}
//删除完满足条件的节点为空后 直接返回null
if (head == null) {
return null;
}
//将当前的head节点当前虚拟节点进行遍历
ListNode pre = head;
while (head.next != null) {
if (head.next.val == val) {
pre.next = pre.next.next;
} else {
pre = pre.next;
}
}
return head;
}
2.使用虚拟节点解决
// 使用虚拟节点简化haed操作
public ListNode removeElement3(ListNode head,int val) {
ListNode dummyHead = new ListNode(-1);
dummyHead.next = head;
ListNode pre = dummyHead;
while (pre.next != null) {
if (pre.next.val == val) {
pre.next = pre.next.next;
} else {
pre = pre.next;
}
}
return dummyHead.next;
}
3.使用递归解决问题
// 使用递归解决问题
// 将问题分解为 head + haed.next的链表
public ListNode removeElement4(ListNode head, int val) {
//空链表没得删 直接返回null
if (head == null) return null;
ListNode res = removeElement4(head.next, val);
//分解为 head + haed.next的链表
//head满足条件 就返回haed.next的链表
//head不满足条件 就返回head接上满足条件的链表
if (head.val == val) {
return res;
} else {
head.next = res;
return head;
}
}
//简化操作为
public ListNode removeElement5(ListNode head, int val) {
//空链表没得删 直接返回null
if (head == null) return null;
head.next = removeElement4(head.next, val);
return head.val == val ? head.next : head;
}