牛客網高頻演算法題系列-BM15-刪除有序連結串列中重複的元素-I

雄獅虎豹發表於2022-06-14

牛客網高頻演算法題系列-BM15-刪除有序連結串列中重複的元素-I

題目描述

刪除給出連結串列中的重複元素(連結串列中元素從小到大有序),使連結串列中的所有元素都只出現一次

原題目見:BM15 刪除有序連結串列中重複的元素-I

解法一:連結串列遍歷

首先,考慮特殊情況,如果連結串列為空或者只有一個結點,不會有重複的元素,返回原連結串列。

否則,遍歷連結串列結點,判斷是否有重複的元素,處理過程如下:

  • 使用pre記錄上一個未重複的結點,初始化為連結串列頭;
  • 然後從連結串列的第二個結點next開始遍歷連結串列結點;
  • 如果next和pre的值相同,則刪除當前重複結點;
  • 如果next和pre的值不相同,則更新pre的值。

遍歷完成後,連結串列的頭結點並沒有變化,返回頭結點即可。

程式碼

public class Bm015 {
    /**
     * 刪除有序連結串列中重複的元素-I
     *
     * @param head ListNode類
     * @return ListNode類
     */
    public static ListNode deleteDuplicates(ListNode head) {
        // 如果連結串列為空或者只有一個結點,不會有重複的元素,返回原連結串列
        if (head == null || head.next == null) {
            return head;
        }

        // pre記錄上一個未重複的結點
        // next為從第二個節點開始判斷是否有重複元素
        ListNode pre = head, next = head.next;
        // 遍歷連結串列
        while (next != null) {
            // 如果當前結點的值和pre的值相同,則要刪掉當前結點,修改pre的next指標即可
            if (pre.val == next.val) {
                pre.next = next.next;
            } else {
                // 如果當前結點未重複,則更新pre
                pre = next;
            }
            next = next.next;
        }
        return head;
    }

    public static void main(String[] args) {
        ListNode head = ListNode.testCase6();
        System.out.println("原連結串列為");
        ListNode.print(head);

        System.out.println("刪除有序連結串列中重複的元素後的連結串列為");
        ListNode.print(deleteDuplicates(head));
    }
}
$1.01^{365} ≈ 37.7834343329$
$0.99^{365} ≈ 0.02551796445$
相信堅持的力量!

相關文章