1. 題目
- 題目:刪除鏈表中等於給定值 val 的所有節點。(LeetCode 203)
- 案例:
輸入: 1->2->6->3->4->5->6, val = 6
輸出: 1->2->3->4->5
2. 解法一: 先得到第一個不是需要刪除的節點.
public ListNode removeElements(ListNode head, int val) {
while (head != null && head.val == val) {
ListNode delNode = head;
head = head.next;
delNode.next = null;
}
if (head == null) {
return null;
}
ListNode pre = head;
while (pre.next != null) {
if (pre.next.val == val) {
ListNode delNode = pre.next;
pre.next = delNode.next;
delNode.next = null;
} else {
pre = pre.next;
}
}
return head;
}
3. 解法二:使用虛擬頭節點, 不需要特殊處理頭節點
public ListNode removeElements(ListNode head, int val) {
ListNode dummyHead = new ListNode(-1);
dummyHead.next = head;
ListNode pre = dummyHead;
while (pre.next != null) {
if (pre.next.val == val) {
ListNode delNode = pre.next;
pre.next = delNode.next;
delNode.next = null;
} else {
pre = pre.next;
}
}
return dummyHead.next;
}
4. 解法三:使用遞歸
public ListNode removeElements(ListNode head, int val) {
if (head == null) {
return null;
}
ListNode result = removeElements(head.next, val);
if (head.val == val) {
return result;
} else {
head.next = result;
return head;
}
}