当前位置: 首页 > 知识库问答 >
问题:

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

宁卓
2023-03-14

我目前正在上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;

下面的代码是insert函数,我需要确保新插入的块连接,但我很难想出一种方法使它同时连接这两个块。

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个答案

周良弼
2023-03-14

对于双链接列表,您需要在类中添加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子句的空列表情况。还可以在添加节点时为tail设置next和prev引用。

要将节点插入到列表的某个位置,您需要考虑到,如果指定的位置小于0或大于现有列表大小,则会发生错误,因为您无法插入具有出界索引的元素。所以你可以抛出异常。当插入的位置在0head)或在size尾部)时,您还需要将大小写分开。考虑到所有这些情况,解决办法是:

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;
}
孙自怡
2023-03-14

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

插入伪码:

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
}
 类似资料:
  • 我创建了一个单链表函数,我的教授说,为了获得额外的学分,我们可以将其更改为双链表。我读了一些东西,比如添加一个prev_节点函数,比如这样。 然而,我不知道从那里去哪里。我知道我需要像这里一样加上一个尾巴和一个脑袋。 谁能告诉我,(不要为我做这件事),我必须做什么才能把我的链接列表变成一个双重链接列表?我知道我现在必须参考尾巴和头部,但我对如何做到这一点很困惑。

  • 在今天的一次采访中,我被问到了这个问题。 除了回答倒序和前后遍历外,面试官还不断强调其中的一些“基本点”。我放弃了,当然在面试后做了一些调查。在双链表中插入和删除似乎比单链表更有效。我不太清楚如何才能更有效地使用双链接列表,因为显然需要更改更多的引用。有人能解释背后的秘密吗?老实说,我做了相当多的研究,但未能理解我的主要问题是,仍然需要对双链接列表进行O(n)搜索。

  • 这就是我到目前为止的代码(由于递归方面的困难,这并不是太多) 几乎只是将头部指针设置为中间信息(4)

  • 我写了一个程序,通过双链表管理银行账户,但我发现取消程序有问题。 我仍然有同样的问题,即使我尝试了这个方法:-(pnt)-

  • 本文向大家介绍双向链表和双向循环链表?相关面试题,主要包含被问及双向链表和双向循环链表?时的应答技巧和注意事项,需要的朋友参考一下 双向链表: 包含两个指针,一个prev指向前一个节点,一个next指向后一个节点。 双向循环链表: 最后一个节点的 next 指向head,而 head 的prev指向最后一个节点,构成一个环。

  • 本文向大家介绍在C ++中将单链表转换为XOR链表,包括了在C ++中将单链表转换为XOR链表的使用技巧和注意事项,需要的朋友参考一下 在本教程中,我们将讨论将单链表转换为XOR链表的程序。 为此,我们将提供一个单链表。我们的任务是获取该列表的元素,并将其转换为XOR链接列表。 示例 输出结果