簡體   English   中英

將單鏈列表轉換為雙鏈列表

[英]Converting a singly linked list to a doubly linked list

首先,我進行了搜索,但似乎找不到任何可以幫助我更好地理解實現雙重鏈接列表的內容。 我還要說的是,這也是我的一項任務,我不希望有人為我做這件事。 話雖如此,我有一個用於添加,刪除,獲取大小,清除等的單鏈接列表(線性)的工作代碼,並且我想在此代碼中實現雙鏈接列表實現。

據我了解,這應該很簡單。 但是,我的書並沒有涉及太多細節,僅提供了很少的示例。 我很難想象如何實現這一點。 我意識到在單鏈列表中,前一個節點僅指向下一個節點,這要求您在想要刪除或添加任何內容時遍歷整個列表。 在雙向鏈表中,它應該從最靠近您正在使用的節點的一端開始遍歷。 如果我的理解不正確,請糾正我。

這是我到目前為止已修改的代碼。

private class Node
{
    private T data;
    private Node next;
    private Node previous;



    private Node(T dataPortion)
    {
        this(dataPortion, null, null);
    }

    private Node(T dataPortion, Node nextNode, Node prevNode)
    {
        data = dataPortion;
        next = nextNode;
        previous = prevNode;

    }

我在列表中添加了“先前的私有節點”作為對先前節點的引用,並將其設置為等於代碼中遵循先前格式的prevNode。 在繼續進行各個方法之前,我在初始設置中還有其他需要做的事情嗎?

在我的每個方法中,我不確定現在要使用它來引用上一個Node和當前下一個Node時需要做什么。 有人可以幫我解決這個問題,可能提供一些示例代碼嗎? 這是當前的添加方法以供參考。

public boolean add(T newEntry)
{
    Node newNode = new Node(newEntry);

    if (isEmpty())
        firstNode = newNode;
    else
    {
        Node lastNode = getNodeAt(numberOfEntries);
        lastNode.setNextNode(newNode);
    }

    numberOfEntries++;

    return true;
}

編輯:添加了上一個Node的set和get方法。

private Node getNextNode()
    {
        return next;
    }

    private Node getPrevNode()
    {
        return previous;
    }

    private void setNextNode(Node nextNode)
    {
        next = nextNode;
    }
    private void setPrevNode(Node prevNode)
    {
        previous = prevNode;
    }

這是我應該添加的嗎?

public boolean add(T newEntry)
{
    Node newNode = new Node(newEntry);


    if (isEmpty())
        firstNode = newNode;
    else
    {
        Node lastNode = getNodeAt(numberOfEntries);
        Node prevNode = getNodeAt(numberOfEntries -1);
        lastNode.setNextNode(newNode);
        newNode.setPrevNode(prevNode);
    }

    numberOfEntries++;

    return true;
}

一切都正確。 您只需要添加newNode.setPreviousNode(lastNode)

您可以查看LinkedList以供參考。 它們將兩個節點存儲在列表中,以供參考firstlast 通過這種方法,您無需使用getNodeAt函數即可遍歷add方法中的所有列表。

LinkedList中add方法的實現

void linkLast(E e) {
    final Node<E> l = last;
    final Node<E> newNode = new Node<>(l, e, null);
    last = newNode;
    if (l == null)
        first = newNode;
    else
        l.next = newNode;
    size++;
    modCount++;
}
public boolean add(T newEntry)
{
    Node newNode = new Node(newEntry);
    newNode.previous = this;
    newNode.next = next;
    next = newNode;
    numberOfEntries++;
    return true;
}

最主要的是,您不需要知道其余數據結構在做什么。 您甚至不需要知道還有其他節點。 您只是告訴節點添加此節點並更新鏈接。 或者通過刪除對該節點的引用來刪除該節點。

public void remove() {
     if (next != null) next.previous = previous;
     if (previous != null) previous.next = next;
     numberofEntries--;
}

暫無
暫無

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

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