[英]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
以供參考。 它們將兩個節點存儲在列表中,以供參考first
和last
。 通過這種方法,您無需使用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.