【问题标题】:Java doubly linked list loopingJava双向链表循环
【发布时间】:2021-07-05 13:22:27
【问题描述】:

我的目标是通过我创建的列表向后循环,如果一个元素小于我选择的数字t 一个具有t 值的节点将被插入到更小的元素前面。此外,如果列表中的每个元素都大于t,则值为t 的节点将被放置在列表的开头。示例:

DoublyLinkedList<Integer> list = new DoublyLinkedList<>();

list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);

list.addAtFirstSmaller(4);
System.out.println("Nodelist: " + list.toString());

我应该期待结果: [1, 2, 4, 3, 4, 5] 但相反,我得到: [1, 2, 3, 4, 4, 5]

这是我目前的代码:

public void addAtFirstSmaller(T t)
{
    ListNode<T> node = tail;
    ListNode<T> newNode = new ListNode<T>(t);
    while(node.previous != null)
    {
        int compared = node.previous.element.compareTo(t);
        node = node.previous;
        if(compared < 0)
        {
            ListNode<T> temp = node.next;
            node.next = newNode;
            newNode.next = temp;
            newNode.next.previous = newNode;
            node.previous = null;
            size++;
        }
        else if(compared > 0 && node.previous == null)
        {
            addFirst(t);
            size++;
        }
    }
}

对我来说,似乎一切都被推到了右边。有什么想法吗?

【问题讨论】:

  • i should expect the outcome: [1, 2, 4, 3, 4, 5] 为什么这是预期的结果? t will be inserted in front of the element that is smaller. 如果 t 被插入到一个较小的元素之前,它应该在 3 之后,而不是在它之前。
  • 也许我误解了我的任务,任务内容如下:在这种方法中,您从后面遍历列表中的元素(即从列表末尾开始并进行)。一旦列表中的元素小于 t,t 就会添加到该元素前面的列表中。你可以说你从列表的后面开始,找到列表中小于 t 的第一个值(“第一个更小”)并在元素前面添加 t(创建一个你挤压的节点)。跨度>
  • 是的,我想你误会了。您当前的输出是正确的。以防万一,我会和你的导师核实一下。
  • 刚刚给他发了一封邮件,如果正确的话我会标记这个帖子为已解决。
  • 在标记线程关闭之前,请为其创建一个答案,然后接受它。除非其他人在这里给出答案。

标签: java linked-list nodes element doubly-linked-list


【解决方案1】:

正如您已经验证的那样:示例输出是正确的,因为其想法是保持列表排序。这种误解是可以理解的,因为 “在前面” 有点模棱两可。

但是,您的代码仍然存在一些问题:

  • 虽然分配node.previous = null 将使循环在您插入新节点后结束,但这会破坏真正应该保持不变的previous 链接。只有头节点应该有previous 等于null,而一般node 可以有一个前任,它必须保持它的前任。

  • newNode.previous 从不接收值。应该设置为node

  • 当要插入的值大于尾节点中的值时,该节点将被插入错误的位置——代码中永远不会出现新节点成为新尾节点的情况,但这是应该预见的可能性。

  • 我会假设addFirst 已经增加了size,因此在调用此函数后再次增加它是错误的。这确实应该是addFirst的责任。

假设你已经实现了addLast,修正后的代码可能是这样的:

public void addAtFirstSmaller(T t) {
    ListNode<T> node = tail;
    ListNode<T> newNode = new ListNode<T>(t);
    while (node != null && node.element.compareTo(t) >= 0) {
        node = node.previous;
    }
    if (node == null) {
        addFirst(t);
    } else if (node == tail) {
        addLast(t);
    } else {
        ListNode<T> temp = node.next;
        node.next = newNode;
        newNode.next = temp;
        newNode.previous = node;
        temp.previous = newNode;
        size++;
    }
}

如果您还没有,addLast 可能如下所示:

public void addLast(T t) {
    ListNode<T> newNode = new ListNode<T>(t);
    tail.next = t;
    t.previous = tail;
    tail = t;
    size++;
}

【讨论】:

  • 啊,谢谢!我已经有了 addLast 方法,现在代码可以完美运行,谢谢!
  • 很高兴听到!我了解到您的问题只是关于作业中的歧义,您已与老师澄清过,但也许您仍然可以考虑mark an answer as accepted
【解决方案2】:

我刚收到导师的答复,我的输出似乎是正确的(即 [1, 2, 3, 4, 4, 5])。我会将这个线程标记为关闭,因为代码正在运行。

【讨论】:

  • 好的,您的代码仍然存在问题:它没有正确插入大于尾部值的值。
猜你喜欢
  • 1970-01-01
  • 2013-11-15
  • 1970-01-01
  • 2018-08-30
  • 1970-01-01
  • 2011-12-15
  • 2011-11-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多