溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java怎么刪除排序鏈表中的重復元素

發布時間:2021-12-20 15:02:47 來源:億速云 閱讀:153 作者:iii 欄目:大數據
# Java怎么刪除排序鏈表中的重復元素

在處理鏈表數據結構時,刪除重復元素是一個常見需求。對于已排序的鏈表,我們可以利用其有序特性高效地完成去重操作。本文將介紹兩種Java實現方法:**迭代法**和**遞歸法**,并分析它們的優缺點。

## 一、問題描述

給定一個**按升序排列**的鏈表,刪除所有重復元素,使每個元素只出現一次。例如:

輸入:1 → 1 → 2 → 3 → 3  
輸出:1 → 2 → 3

## 二、迭代法實現

```java
public ListNode deleteDuplicates(ListNode head) {
    if (head == null || head.next == null) {
        return head;
    }
    
    ListNode current = head;
    while (current != null && current.next != null) {
        if (current.val == current.next.val) {
            current.next = current.next.next; // 跳過重復節點
        } else {
            current = current.next; // 移動指針
        }
    }
    return head;
}

時間復雜度:O(n),只需遍歷一次鏈表
空間復雜度:O(1),僅使用常量額外空間

三、遞歸法實現

public ListNode deleteDuplicates(ListNode head) {
    if (head == null || head.next == null) {
        return head;
    }
    
    head.next = deleteDuplicates(head.next);
    return head.val == head.next.val ? head.next : head;
}

時間復雜度:O(n)
空間復雜度:O(n)(遞歸??臻g)

四、方法對比

方法 優點 缺點
迭代法 空間效率高 代碼相對直接
遞歸法 代碼簡潔 棧溢出風險(長鏈表)

五、邊界情況處理

  1. 空鏈表:直接返回null
  2. 單節點鏈表:無需處理
  3. 全重復鏈表:如 1→1→1,應返回1

六、擴展:刪除所有重復項

如果需要徹底刪除所有重復出現的元素(保留僅出現一次的元素),可采用雙指針法:

public ListNode deleteAllDuplicates(ListNode head) {
    ListNode dummy = new ListNode(0);
    dummy.next = head;
    ListNode prev = dummy;
    
    while (head != null) {
        if (head.next != null && head.val == head.next.val) {
            while (head.next != null && head.val == head.next.val) {
                head = head.next;
            }
            prev.next = head.next; // 跳過所有重復節點
        } else {
            prev = prev.next;
        }
        head = head.next;
    }
    return dummy.next;
}

七、總結

對于已排序鏈表的去重: - 優先選擇迭代法,兼顧效率和安全性 - 遞歸法適合鏈表長度可控的場景 - 注意處理邊界條件,保證代碼健壯性

掌握這些方法后,可以輕松應對LeetCode 83(保留重復項)和82(刪除所有重復項)等相關題目。 “`

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女