我有2个圆形双链表,头节点为h1和h2。我需要在h1末尾添加h2。 但是,如果不使用额外的指针,我无法做到这一点。我相信不使用任何额外的指针是不可能的,因为我们将总是丢失任何一个列表的最后一个节点的地址(除非我们遍历到没有额外指针的情况下无法完成的最后一个节点)。 如何可能的任何线索?
答案 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)模糊不清。因此,除非您的处理器非常缺少寄存器,否则完全没有任何建议。一个不太合适的编译器可能会优化掉一些废话...但可能无法提出最简单的代码(即,不要发现两个临时指针简化了事情。)