如何将单链表更改为双向链表?

时间:2013-09-12 18:29:42

标签: java singly-linked-list doubly-linked-list

我目前正在上Java课程,教授告诉我们理解链接的一个好习惯是制作一个双重链表。我已经制作了一个单独的链接列表,但我无法将其转换为双向链表。所以我想知道是否有人可以给我任何建议,以确保我的最后一个号码与前一个号码相关联?如果前面的数字和最后一个数字连接到null。以下是代码的一部分,如果您希望更多内容只是询问,我将发布。

添加元素等的代码。这是我试图让尾部连接到最后一个数字的尝试。

public void add(int element){

            Node n = new Node();
            n.setItem(element);
            n.setNext(head);
            head = n;
            >
            //The tail connected to the new number added.
            n.setItem(element);
            n.setBefore(tail);
            tail = n;

下面的代码是插入函数,我需要确保新插入的块连接,但是我正在考虑一种方法来连接两者。

public void insert(int element, int position){

        int currentposition = 0;
        Node currentNode = head;

        //Traverse to the right position
        while(currentposition < position-1){

            currentposition++;
        } 
        Node n = new Node();
        n.setItem(element);
        n.setNext(currentNode.getNext());
        currentNode.setNext(n);

        //The previous number connecting to the new number
        currentNode = tail;

    }

2 个答案:

答案 0 :(得分:0)

您为每个保存其先前节点的节点添加一个额外的节点字段

插入伪码:

insert(Node n, index i) {
    currentIndex = 0
    currentNode = head
    while (currentIndex < i) {
      currentNode = currentNode.next
      currentIndex++
    }
    n.prev = currentNode
    n.next = currentNode.next
    currentNode.next = n
}

答案 1 :(得分:0)

对于双向链表,您需要在类中添加head和tail字段,以便它保持双向链接的数据结构。

private Node<T> head = null;
private Node<T> tail = head;
private int size = 0;

要将新节点添加到链接列表的末尾,您可以执行

public void add(T element) {
    Node<T> node = new Node<T>(element);
    Node<T> current = head;
    if(current == null) {
        current = node;
        head = tail = current;
    } else {
        tail.next = node;
        node.prev = tail;
        tail = node;
    }
    size++;
}

请注意,您还需要处理第一个if子句的空列表大小写。您还可以在添加节点时为尾部设置next和prev参考。

要在特定位置将列表插入列表,您需要考虑如果指定的位置小于0或大于现有列表大小,则会发生错误,因为您无法插入超出范围的元素指数。所以你可以抛出异常。此外,当插入的位置为0head)或sizetail)时,您需要将案例分开。考虑到所有这些情况,解决方案是:

public void insert(T a, int position) {
    if (position < 0 || position > size)
        throw new IndexOutOfBoundsException();
    Node<T> node = new Node<T>(a);
    Node<T> temp;
    if(position == 0) {
        if(head == null)
            add(a);
        else {
            temp = head;
            head = node;
            node.next = temp;
            temp.prev = node;
        }
        return;
    } else if (position == size) {
        temp = tail;
        tail = node;
        temp.next = tail;
        tail.prev = temp;
        return;
    }

    Node<T> current = head;
    int i = 0;
    while (current != null && i < position-1) {
        current = current.next;
        i++;
    }

    temp = current.next;
    current.next = node;
    node.prev = current;
    node.next = temp;
    temp.prev = node;
}