Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在双链接列表中插入节点_Java_Data Structures_Linked List - Fatal编程技术网

Java 在双链接列表中插入节点

Java 在双链接列表中插入节点,java,data-structures,linked-list,Java,Data Structures,Linked List,我无法理解将新节点连接到双链接列表的后半部分。我正在编写一个add方法,该方法接收要插入新节点的节点。我的难点在于理解如何在将以前的节点链接重新定向到新节点后链接到下一个节点 所以,这是我想到的 Chunk<E> newChunk= new Chunk<E>(); newChunk.next= prevChunk.next; prevChunk.next= newChunk; newChunk.prev= newChunk.next.prev;

我无法理解将新节点连接到双链接列表的后半部分。我正在编写一个add方法,该方法接收要插入新节点的节点。我的难点在于理解如何在将以前的节点链接重新定向到新节点后链接到下一个节点

所以,这是我想到的

Chunk<E> newChunk= new Chunk<E>();

    newChunk.next= prevChunk.next;
    prevChunk.next= newChunk;

    newChunk.prev= newChunk.next.prev;
    newChunk.next.prev= newChunk;
Chunk newChunk=newChunk();
newChunk.next=prevChunk.next;
prevChunk.next=newChunk;
newChunk.prev=newChunk.next.prev;
newChunk.next.prev=newChunk;
我的理解是,因为
newChunk.next=prevChunk.next
命令复制prevChunk.next的内存地址,并将该值设置为newChunk.next,然后重置prevChunk.next以链接到newChunk


因此,由于prevChunk是此处引用的唯一一个已经在列表中的节点,并且下一个字段已被重新路由到newChunk,因此我使用这些引用链接到下一个节点的做法是否正确?

类似的方法应该可以工作

Chunk<E> newChunk= new Chunk<E>();

    newChunk.next = prevChunk.next;
    newChunk.prev = prevChunk;
    prevChunk.next = newChunk;
    newChunk.next.prev = newChunk;
Chunk newChunk=newChunk();
newChunk.next=prevChunk.next;
newChunk.prev=prevChunk;
prevChunk.next=newChunk;
newChunk.next.prev=newChunk;

您所拥有的是正确的。然而,这有点难理解(因此你的问题)。以下是一个更直观的解决方案,它应该可以工作,并且对您来说更容易理解:

Chunk<E> newChunk = new Chunk<E>();
Chunk<E> nextChunk = prevChunk.next;

prevChunk.next = newChunk;
newChunk.prev = prevChunk;

nextChunk.prev = newChunk;
newChunk.next = nextChunk;
Chunk newChunk=newChunk();
Chunk nextChunk=prevChunk.next;
prevChunk.next=newChunk;
newChunk.prev=prevChunk;
nextChunk.prev=newChunk;
newChunk.next=nextChunk;

我创建了链接列表中下一个节点的新引用。这可能与上一个答案一样有效,因为它创建了一个新的引用,但应该有助于您理解解决方案。

您是正确的,但另一方面,大多数双链接列表不是循环的,因为lastNode的next不是firstNode(与firstNode的prev相同,prev不是lastNode)。 如果“prevChunk”是双链接列表中的最后一个节点,并且您将在prevChunk之后添加newChunk作为链接列表中的最后一项

NewChunk.prev= newChunk.next.prev;
实际上是将NewChunk的previous元素设置为null的previous元素,这可能不是您想要的


您可能需要检查previous.next最初是否为null。

您可以直接执行newChunk,prev=prevChunk,而不是newChunk.prev=newChunk.next.prev。这实际上是一个循环链表,其中每个节点都包含一个大小数组,并包含一个虚拟头节点。如果(nextNode.next=head)