簡體   English   中英

從鏈表中刪除所有節點(給定開始索引和結束索引)

[英]Removing all nodes from linked list (given a start and an end index)

我正在寫一個額外的removeRange()方法,除了一個start index和一個end index作為參數。 我已經通過了所有條件,除了節點數等於從開始到結束的范圍時。

我的鏈表示例包含:

1 -> 2 -> 3

在調用方法removeRange(0,2)

list應該變為null ,因為從0到2,計數為3,所以列表中也有3個元素。

查看圖片,以更好地了解發生的情況。

在此處輸入圖片說明

碼:

public void removeRange(int start, int end) {
    if(start < 0 || end < 0) {
        throw new IllegalArgumentException();
    } 
    if(start == 0 && end == 0) {
        front = front.next;
    } else if (start == 0 && end == 1) {
        front = front.next.next;
    } else {
        ListNode head = front;
        for(int i = 0; i < start-1;i++) {
            head = head.next;
        }
        ListNode tail = front;
        for(int i = 0; i < end;i++) {
            tail = tail.next;
        }
        head.next = tail.next;
    }
}

對任何鏈接的數據結構(列表,樹,圖形)進行編碼的最佳方法是獲得白板並繪制鏈接的列表。 然后,對於測試輸入,就像計算機將執行代碼一樣,一次只執行一行代碼。 對於每一行,在繪制的版本上進行相應的更改。 在某些時候,代碼將告訴您繪制一些您認為不正確的內容,並告訴您問題出在哪里。

我在您的代碼中注意到的一件事是,您不確定輸入范圍是否與列表大小成正比。 如果列表的長度為5個節點,並且有人調用removeRante(10,12)怎么辦?

對於此特定問題,您有4種情況,應按此順序進行測試和處理。 1.開始=頭和結束=尾,此時將頭和尾都設為空,從而清空鏈接列表。
2.開始=頭。 將頭移到終點+1。3.終點=尾。 移動尾巴開始-1。
4.其他一切。 頭=開始+ 1,尾=結束-1。

假設您的tail.next == null那么您仍然需要設置front = head就像在以前的情況下更新front

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM