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