在不使用额外指针的情况下连接2个循环双链表

时间:2014-09-01 13:22:24

标签: pointers data-structures linked-list

我有2个圆形双链表,头节点为h1和h2。我需要在h1末尾添加h2。 但是,如果不使用额外的指针,我无法做到这一点。我相信不使用任何额外的指针是不可能的,因为我们将总是丢失任何一个列表的最后一个节点的地址(除非我们遍历到没有额外指针的情况下无法完成的最后一个节点)。 如何可能的任何线索?

1 个答案:

答案 0 :(得分:2)

因为列表是循环,所以你可以轻松地找到它们的尾部。所以要追加你只需要两个临时指针(t1和t2),程序是(假设两个列表都不为空):

  t1       = h1->prev ;
  t2       = h2->prev ;
  h1->prev = t2 ;
  t1->next = h2 ;
  h2->prev = t1 ;
  t2->next = h1 ;

你可以在没有临时指针的情况下做到这一点:

  h1->prev->next = h2 ;               // t1->next = h2
  h2->prev->next = h1 ;               // t2->next = h1
  h2             = h1->prev ;
  h1->prev       = h2->next->prev ;   // h1->prev = t2
  h2->next->prev = h2 ;               // h2->prev = t1

但这是(a)更多的工作和(b)模糊不清。因此,除非您的处理器非常缺少寄存器,否则完全没有任何建议。一个不太合适的编译器可能会优化掉一些废话...但可能无法提出最简单的代码(即,不要发现两个临时指针简化了事情。)