Java實現ListNode的數據結構與演算法

一、什麼是ListNode?

ListNode是鏈表的一個重要組成部分,可以存儲任意類型的數據,並且每個節點都指向下一個節點,形成了鏈式的結構。相比於數組,鏈表的插入、刪除操作更加高效,但是訪問元素的時間複雜度為O(n)。

二、Java實現ListNode的基本結構

class ListNode<T> {
    T val;
    ListNode<T> next; 
    public ListNode(T val) {
        this.val = val; 
        this.next = null;
    }
}

上述代碼的ListNode類中,使用泛型T來表示任意類型的數據,每個節點包含一個val值和一個next指向下一個節點的引用。

三、Java實現ListNode的基本操作

1. 添加節點

public static <T>void addNode(ListNode<T> head, T val) {
    ListNode<T> newNode = new ListNode<T>(val);
    if (head == null)
        head = newNode;
    else {
        ListNode<T> temp = head;
        while (temp.next != null)
            temp = temp.next;
        temp.next = newNode; 
    }
}

該代碼實現了向鏈表末尾添加節點的功能,如果鏈表為空則直接將新節點設置為頭節點,否則遍歷鏈表找到末尾,將新節點添加到鏈表尾部。

2. 刪除節點

public static <T>void deleteNode(ListNode<T> head, T val) {
    ListNode<T> temp = head;
    ListNode<T> prev = null;
    while (temp != null && !temp.val.equals(val)) {
        prev = temp;
        temp = temp.next;
    }
    if (temp != null && prev == null)
        head = head.next;
    else if (temp != null)
        prev.next = temp.next;
}

該代碼實現了刪除鏈表中某個節點的功能,如果鏈表頭節點即為目標節點,則將頭節點指向下一個節點,否則遍歷整個鏈表,找到目標節點的前一個節點,將其next指向目標節點的下一個節點。

3. 反轉鏈表

public static <T>ListNode<T> reverseList(ListNode<T> head) {
    if (head == null || head.next == null)
        return head;
    ListNode<T> prev = null;
    ListNode<T> curr = head;
    while (curr != null) {
        ListNode<T> temp = curr.next;
        curr.next = prev;
        prev = curr;
        curr = temp;
    }
    return prev;
}

該代碼實現了反轉鏈表的功能,使用三個指針prev、curr和temp,每次迭代將curr的next指向prev,prev和curr向後移動一位,直到curr為null為止。

四、Java實現ListNode的應用

1. 判斷鏈表是否有環

public static <T>boolean hasCycle(ListNode<T> head) {
    if (head == null || head.next == null)
        return false;
    ListNode<T> slow = head;
    ListNode<T> fast = head.next;
    while (slow != fast) {
        if (fast == null || fast.next == null)
            return false;
        slow = slow.next;
        fast = fast.next.next;
    }
    return true;
}

該代碼實現了判斷鏈表是否有環的功能,使用快指針和慢指針同時遍歷鏈表,如果存在環,則快指針和慢指針一定會相遇。

2. 合併兩個有序鏈表

public static <T extends Comparable<T>>ListNode<T> mergeTwoLists(ListNode<T> l1, ListNode<T> l2) {
    ListNode<T> dummy = new ListNode<>(null);
    ListNode<T> curr = dummy;
    while (l1 != null && l2 != null) {
        if (l1.val.compareTo(l2.val) <= 0) {
            curr.next = l1;
            l1 = l1.next;
        } else {
            curr.next = l2;
            l2 = l2.next;
        }
        curr = curr.next;
    }
    if (l1 != null)
        curr.next = l1;
    if (l2 != null)
        curr.next = l2;
    return dummy.next;
}

該代碼實現了合併兩個有序鏈表的功能,類似於歸併排序,使用一個dummy節點和一個curr指針,將兩個鏈表依次比較,將較小的節點加入到新鏈表中。

3. 刪除鏈表中間節點

public static <T>void deleteMiddleNode(ListNode<T> head) {
    ListNode<T> slow = head;
    ListNode<T> fast = head;
    ListNode<T> prev = null;
    while (fast != null && fast.next != null) {
        prev = slow;
        slow = slow.next;
        fast = fast.next.next;
    }
    prev.next = slow.next;
}

該代碼實現了刪除鏈表中間節點的功能,使用快指針和慢指針同時遍歷鏈表,當快指針到達末尾時,慢指針剛好到達鏈表中間節點,將中間節點的前一個節點的next指向中間節點的後一個節點即可。

原創文章,作者:EMHZ,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/147301.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
EMHZ的頭像EMHZ
上一篇 2024-11-01 14:08
下一篇 2024-11-01 14:08

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java Bean載入過程

    Java Bean載入過程涉及到類載入器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean載入的過程。 一、類載入器 類載入器是Java虛擬機…

    編程 2025-04-29
  • 蝴蝶優化演算法Python版

    蝴蝶優化演算法是一種基於仿生學的優化演算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化演算法Python版…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Python實現爬樓梯演算法

    本文介紹使用Python實現爬樓梯演算法,該演算法用於計算一個人爬n級樓梯有多少種不同的方法。 有一樓梯,小明可以一次走一步、兩步或三步。請問小明爬上第 n 級樓梯有多少種不同的爬樓梯…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • AES加密解密演算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密演算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES演算法,並對實現過程進…

    編程 2025-04-29
  • Java判斷字元串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字元串中是否存在多個指定字元: 一、字元串遍歷 字元串是Java編程中非常重要的一種數據類型。要判斷字元串中是否存在多個指定字元…

    編程 2025-04-29

發表回復

登錄後才能評論