移除鏈表元素(java)

刪除鏈表中等於給定值 val 的所有節點。

示例

輸入: 1->2->6->3->4->5->6, val = 6
輸出: 1->2->3->4->5

時間複雜度打敗了94%的人
空間複雜度打敗了64%的人
第一次做力扣的題呀,還有點小迷。說一下解題思路叭?
其實它向後遍歷鏈表,每次操作是相同的,我們就可以考慮用遞歸實現了。
1.老規矩,判斷輸入的鏈表頭節點值是否爲空,如果爲空,直接返回null或者頭節點都行。遞歸頭
2.傳入的結點是頭節點,並且頭結點就是所要刪除的結點時,返回null即可。遞歸頭
3.newHead.next != null。又可分爲兩種情況

  • newHead.val == val。當前頭結點就是所要刪除的結點,直接返回頭節點的下一個結點。
  • newHead.next.val == val。相當於當前的結點是所要刪除結點的前驅,此時你前驅已經找到,普通的鏈表刪除操作應該不用我說了叭。當前結點操作完,就確定它對應的next域就好了呀。
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public static ListNode removeElements(ListNode head, int val) {
        ListNode newHead = head;
        if(newHead == null)
            return newHead;
        if(newHead.next == null && newHead.val == val){
            return null;
        }
        if(newHead.next != null){
            if(newHead.val == val){
                return removeElements(newHead.next,val);
            }
            if(newHead.next.val == val){
                ListNode toDelete = newHead.next;
                newHead.next = toDelete.next;
                toDelete.next = null;
            }
            newHead.next = removeElements(newHead.next,val);
        }
        return newHead;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章