Java双链表循环

Java双链表循环,java,linked-list,nodes,element,doubly-linked-list,Java,Linked List,Nodes,Element,Doubly Linked List,我的目标是在我创建的列表中向后循环,如果某个元素小于我选择的编号t,则将在较小的元素前面插入一个值为t的节点。此外,如果列表中的每个元素都大于t,则值为t的节点将放在列表的开头。例如: DoublyLinkedList=new DoublyLinkedList(); 增加第(1)款; 增加(2); 增加(3); 增加(4); 增加(5); 列表。添加第一个较小的(4); System.out.println(“节点列表:+list.toString()); 我应该期待结果: [1,2,4,3,

我的目标是在我创建的列表中向后循环,如果某个元素小于我选择的编号
t
,则将在较小的元素前面插入一个值为
t
的节点。此外,如果列表中的每个元素都大于
t
,则值为
t
的节点将放在列表的开头。例如:

DoublyLinkedList=new DoublyLinkedList();
增加第(1)款;
增加(2);
增加(3);
增加(4);
增加(5);
列表。添加第一个较小的(4);
System.out.println(“节点列表:+list.toString());
我应该期待结果:
[1,2,4,3,4,5]
但我得到的却是:
[1,2,3,4,4,5]

这是我目前的代码:

public void addAtFirstSmaller(T)
{
ListNode=tail;
ListNode newNode=新ListNode(t);
while(node.previous!=null)
{
int compared=node.previous.element.compareTo(t);
node=node.previous;
如果(比较<0)
{
ListNode temp=node.next;
node.next=newNode;
newNode.next=temp;
newNode.next.previous=newNode;
node.previous=null;
大小++;
}
else if(比较>0&&node.previous==null)
{
addFirst(t);
大小++;
}
}
}

在我看来,似乎一切都被推向了正确的方向。你知道怎么做吗?

我刚收到老师的回答,我的输出似乎是正确的([1,2,3,4,4,5])。我将在代码运行时将此线程标记为已关闭。

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

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

  • 虽然在插入新节点后,赋值
    node.previous=null
    将使循环结束,但这会中断实际上应该保持不变的
    previous
    链接。只有头部节点的
    previous
    应等于
    null
    ,而通常
    节点可以有一个前置节点,它必须保留其前置节点

  • newNode.previous
    从不接收值。它应该设置为
    节点

  • 当要插入的值大于tail节点中的值时,节点将被插入到错误的位置——在代码中从来没有新节点将成为新tail的场景,但这是一种应该预见的可能性

  • 我假设
    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++;
    }
}
public void addLast(T t) {
    ListNode<T> newNode = new ListNode<T>(t);
    tail.next = t;
    t.previous = tail;
    tail = t;
    size++;
}

我应该预期结果:[1,2,4,3,4,5]
为什么这是预期结果<代码>t将插入较小元素的前面。
如果t插入较小元素的前面,它应该在3之后,而不是在3之前。可能我误解了我的任务,任务内容如下:在这种方法中,您从后面遍历列表中的元素(即从列表的末尾开始,然后继续)。一旦列表中的一个元素小于t,t就会添加到该元素前面的列表中。你可以说,从列表的后面开始,找到列表中第一个小于t的值(“第一个更小”),然后在元素前面加上t(创建一个你挤压的节点)。是的,我想你误解了。您当前的输出是正确的。为了以防万一,我会和你的指导老师核实一下。刚刚给他发了一封电子邮件,如果这个线程是正确的,我会将它标记为已解决。在你标记线程关闭之前,请为它创建一个答案,然后接受它。除非其他人在这里给出答案。好的,您的代码仍然有一个问题:它没有正确插入大于尾值的值。啊,谢谢!我已经有了addLast方法,现在代码工作得很好,谢谢!很高兴听到!我知道你的问题只是关于作业中的一个歧义,你和你的老师澄清过,但也许你还可以考虑。