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;
}