我无法理解将新节点连接到双链表的后半部分。我正在编写一个add方法,该方法接收新节点之后要插入的节点。我的困难之处在于理解在将前一个节点链接重定向到新节点之后如何链接到下一个节点。
所以,这就是我提出来的地方
Chunk<E> newChunk= new Chunk<E>();
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,我是否在使用这些引用链接到下一个节点的正确轨道上?
答案 0 :(得分:3)
你是对的,但是在旁注中,大多数双链表不是循环的,因为lastNode的下一个不是firstNode(与firstNode的prev相同,不是lastNode)。 如果“prevChunk”是双链表中的最后一个节点,并且您在prevChunk之后添加newChunk作为链表中的最后一项,
NewChunk.prev= newChunk.next.prev;
实际上是将NewChunk的前一个元素设置为null的前一个元素,这可能不是你想要的
您可能想要检查previous.next最初是否为空。
答案 1 :(得分:-1)
这样的事情应该有效。
Chunk<E> newChunk= new Chunk<E>();
newChunk.next = prevChunk.next;
newChunk.prev = prevChunk;
prevChunk.next = newChunk;
newChunk.next.prev = newChunk;
答案 2 :(得分:-1)
你有什么是正确的。但是,它有点难以理解(因此你的问题)。这是一个更直观的解决方案,应该可以工作并且更容易理解:
Chunk<E> newChunk = new Chunk<E>();
Chunk<E> nextChunk = prevChunk.next;
prevChunk.next = newChunk;
newChunk.prev = prevChunk;
nextChunk.prev = newChunk;
newChunk.next = nextChunk;
我创建了一个对链表中下一个节点的新引用。这可能与最后一个答案一样有效,因为它创建了一个新的引用,但应该可以帮助您理解解决方案。