【问题标题】:Inserting node in a double-linked list在双链表中插入节点
【发布时间】:2010-10-13 03:59:44
【问题描述】:

我无法理解将新节点连接到双链表的后半部分。我正在编写一个 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,那么我在使用这些引用链接到下一个节点方面是否走在正确的轨道上?

【问题讨论】:

  • 可以直接做newChunk,prev = prevChunk,而不是newChunk.prev= newChunk.next.prev。

标签: java data-structures linked-list


【解决方案1】:

你是对的,但附带说明一下,大多数双链表不是循环的,因为 lastNode 的 next 不是 firstNode(与 firstNode 的 prev 不是 lastNode 相同)。 如果“prevChunk”是双链表中的最后一个节点,并且您在 prevChunk 之后添加 newChunk 作为链表中的最后一项,

NewChunk.prev= newChunk.next.prev;

本质上是将NewChunk的前一个元素设置为null的前一个元素,这可能不是你想要的

您可能想要检查 previous.next 最初是否为空。

【讨论】:

  • 这实际上是一个循环链表,其中每个节点包含一个 SIZE 数组并包含一个虚拟头节点。我确实有一个测试if (nextNode.next=head)
【解决方案2】:

这样的事情应该可以工作。

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

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

【讨论】:

    【解决方案3】:

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

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

    我创建了对链表中下一个节点的新引用。这可能与最后一个答案一样有效,因为它创建了一个新的参考,但应该可以帮助您理解解决方案。

    【讨论】:

      猜你喜欢
      • 2011-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-20
      • 2018-07-28
      • 1970-01-01
      相关资源
      最近更新 更多