LeetCode - 203. 移除連結串列元素
阿新 • • 發佈:2021-07-12
前言
/**
* @Description LeetCode 203. 移除連結串列元素
* 給你一個連結串列的頭節點 head 和一個整數 val ,
* 請你刪除連結串列中所有滿足 Node.val == val 的節點,並返回新的頭節點 。
* 列表中的節點數目在範圍 [0, 104] 內
* 1 <= Node.val <= 50
* 0 <= val <= 50
*/
具體實現
- 實現類
public class Solution{ /** * Definition for singly-linked list. */ public class ListNode { int val; ListNode next; ListNode() {} ListNode(int val) { this.val = val; } ListNode(int val, ListNode next) { this.val = val; this.next = next; } } /** * 解題一 迭代方法刪除連結串列中所有節點值等於特定值的節點 * 用prev表示當前節點。如果prev的下一個節點不為空且下一個節點的節點值等於給定的val則刪除 * 如果prev的下一個節點的節點值不等於給定的val,則將prev移動到下一個節點即可 * * @param head * @param val * @return */ public ListNode removeElements(ListNode head, int val) { while (head != null && head.val == val) { head = head.next; } if (head == null) { return null; } ListNode prev = head; while(prev.next != null) { if (prev.next.val == val) { prev.next = prev.next.next; } else { prev = prev.next; } } return head; } /** * 解題二 虛擬頭結點迭代 * 建立虛擬節點dummyHead,令dummyHead.next=head, * 初始化prev=dummyHead,然後遍歷連結串列進行刪除操作。 * 最終返回dummyHead.next 即為刪除操作後的頭節點。 * @param head * @param val * @return */ public ListNode removeElements1(ListNode head, int val) { ListNode dummyHead = new ListNode(-1); dummyHead.next = head; ListNode prev = dummyHead; while(prev.next != null) { if (prev.next.val == val) { prev.next = prev.next.next; } else { prev = prev.next; } } return dummyHead.next; } /** * 解題三 遞迴 * head不為空時遞迴地進行刪除操作,後判斷head的節點值是否等於val並決定是否要刪除head * @param head * @param val * @return */ public ListNode removeElements2(ListNode head, int val) { if (head == null) { return null; } head.next = removeElements(head.next, val); return head.val == val ? head.next : head; } }