簡體   English   中英

從循環雙鏈表(Java)中刪除節點?

[英]Removing nodes from a circular doubly linked list (Java)?

我正在編寫一些代碼,在其中我需要刪除循環鏈接列表(其頭部充當虛擬節點)中的項目並返回它(如果要刪除第一個節點)。 我認為我的代碼差不多正確,但是我不確定。

我理解正確嗎? (從虛擬節點開始)

虛擬-> A-> B-> C-> D->虛擬(環繞到虛擬節點)

因此,如果要刪除第一個實際的數據(A),則需要將其分配給temp變量。 因此,節點優先= head.next。 然后,我需要使用虛擬頭部引用“ b”,所以我需要做head.next = first.next。 這是所有需要做的嗎?

private Node remove()
{
     Node returnNode = head.next;
     head.next = returnNode.next;
     return returnNode;
}

在從列表中刪除任何節點N的情況下(假設它在列表中),是否具有相同的概念? 因此,從上面的示例中,我們要刪除節點B。在這種情況下,我們需要將B.next = B.previous和B.previous = B.next設置正確嗎? 還是我需要做類似B.previous.next = B.next和B.next.previous = B.previous的事情? 我是否需要遍歷列表以找到要刪除的元素?

private void removeNode(Node n)
{
    n.next = n.previous; // or n.previous.next = n.next
    n.previous = n.next; // or n.next.previous = n.previous
}

雙重鏈接列表意味着每個節點還具有到先前節點的連接。

您的示例將僅切換下一個和上一個引用。 您應該設置:

n。上一個= n。上一個n。上一個

由於您具有循環鏈接列表,因此只有在添加第一個元素或刪除最后一個元素時才有特殊情況。

無論使用單鏈表,雙鏈表還是循環LL,無論如何都需要遍歷列表以進行刪除或添加。

現在根據您的問題,您沒有提到它是否是雙倍LL,但我假設它與您在第二個示例中使用的node.previous一樣。

根據我的理解,如果您有一個循環LL的節點,則不必擔心該節點是否為頭節點,因為無論如何,使用此節點都可以訪問所有節點。

現在,如果我能夠正確理解您的問題,那么對於您的第一個示例,

如果您需要刪除節點(在這種情況下為A),則需要在功能參數中刪除該節點。 像這樣

// assuming the key exists in your LL.

    private Node remove(Node nodeToBeRemoved)
    {   
        Node returnNode = nodeToBeRemoved
        while(currentNode.data = nodeToBeRemoved.data) {
            returnNode = returnNode.next
        }
        returnNode.previous.next = returnNode.next
        return returnNode;
    }

第二個示例也應如此。

暫無
暫無

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

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