連結串列與遞迴
LeetCode
第203題
題目:
刪除連結串列中等於給定值 val 的所有節點。
示例:
輸入: 1->2->6->3->4->5->6, val = 6
輸出: 1->2->3->4->5
1.不使用虛擬頭節點
public class Solution {
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 head;
} else {
// 現在的連結串列頭節點不是要刪除的元素
ListNode prev = head;
while (prev.next != null) {
if (prev.next.val == val) { // 刪除
ListNode delNode = prev.next;
prev.next = delNode.next;
delNode.next = null;
} else { // 不刪除
prev = prev.next;
}
}
return head;
}
}
}
2.使用虛擬頭節點
public class Solution2 {
public ListNode removeElements(ListNode head, int val) {
// 虛擬頭節點
ListNode dummyHead = new ListNode(0);
dummyHead.next = head;
ListNode prev = dummyHead;
while (prev.next != null) {
if (prev.next.val == val) {
ListNode delNode = prev.next;
prev.next = delNode.next;
delNode.next = null;
} else {
prev = prev.next;
}
}
return dummyHead.next;
}
}
3.遞迴
public class Solution3 {
public ListNode removeElements(ListNode head, int val) {
if (head == null) {
return head;
}
head.next = removeElements(head.next, val);
return head.val == val ? head.next : head;
}
}