[英]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.