如何向自身添加链接列表?

时间:2019-10-21 05:52:37

标签: c++ c++11 linked-list

考虑到这是我的职责:

void addtoSameList(const List &another){
   for (Node *temp = new Node(*head); temp != nullptr; temp = temp -> next){
      Node *ptr = other.head;
      Node *temp2 = new Node;
      temp2->value = temp->value;
      while (ptr -> next != nullptr) {
         ptr = ptr -> next;
      }
      ptr->next = temp2;
      temp2->next = nullptr;
   }
   return;
}

我的目标是向自身添加链表,但我不知道到底出了什么问题。 例如,如果我在主函数中有一个名为n的链表,然后在其中声明:

n.addtoSameList(n);

意味着&other将指向与n相同的节点,我认为我将创建一个新节点并深度复制n的内容。

但是,我的两个输出要么是我陷入无限循环,要么是某个节点最终被跳过。

如何解决此问题?

2 个答案:

答案 0 :(得分:1)

此代码有很多问题。首先,该接口并不建议唯一的用途是将链表添加到自身。也没有建议在任何其他情况下都需要深拷贝。

所以,让我们调整需求...

您想要一个成员函数,该成员函数会将链接列表的副本附加到现有列表中。那么,自我补充的情况自然就不属于问题描述了。

这里的方法是逐步检查传入的链表,仔细复制每个节点,然后重新调整主链表上的指针,使其指向您的新节点,并将新节点中的指针指向设置为显示在列表的末尾。这样可以在列表逐步执行时保持列表不变。

这里有一个陷阱。如果要自我附加,则可能会产生无限循环。因此,在开始此过程之前,您应该找到传入列表的结束节点,并始终使用它来确定是否到达列表的末尾。如果您保持一个尾指针,这是微不足道的。如果您不这样做,则意味着遍历列表。

另一种方法是先简单地创建一个副本,仔细维护指向该副本的第一个节点的指针。然后,只需调整尾节点的下一个指针以指向新列表,然后调整尾节点(如果在LinkedList数据结构中保持该指针)以指向副本的尾节点。这可能就是您应该采取的方式。更干净,更高效。主要缺点是在执行异常处理时进行清理。但是,从您的角度来看,您现在不应该担心这一点。

答案 1 :(得分:0)

这是另一种方法。创建三个指针:ptrBeginptrEndptrNewptrBegin指向链接列表的开头并遍历链接列表,以便ptrEndptrNew指向链接列表的最后一个元素。然后递增ptrBegin直到ptrBegin != ptrEnd,同时将ptrBegin处的数据复制到ptrNew->next处的新节点,并递增ptrNew