繁体   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