【问题标题】:Reverse a LinkedList [duplicate]反转链接列表[重复]
【发布时间】:2015-03-02 19:26:35
【问题描述】:

我正在尝试反转链接列表并将其保存到另一个新的喜欢列表中并删除旧的列表,但是编译时出现错误..这是函数..

LinkedList LinkedList::reverse(){
    LinkedList L2;
    Node * temp=head;
    while(temp->next!=NULL){
        Node * del=NULL;
        L2.addAtFront(temp->data);
        del=temp;
        temp=temp->next;
        delete del;
     }
     return L2;

}

【问题讨论】:

标签: c++ linked-list reverse


【解决方案1】:

当(且仅当)您不再需要原始链表时使用它!

不要使用更便宜的addAtFront(因为您需要为新节点分配内存并销毁旧节点),您可以重用节点和LinkedList(毕竟,你要删除原来的,然后简单地设置指针:

LinkedList LinkedList::reverse(){
    Node* na = head;
    Node* nb = NULL;
    Node* nc = NULL;
    if(na == NULL) {
        return this;
    }
    nb = na->next;
    na->next = NULL;
    while(nb != NULL){
        nc = nb->next;
        nb->next = na;
        na = nb;
        nb = nc;
    }
    tail = head; //if you keep a tail?
    head = na;
    return this;
}

该方法的工作原理如下,您扫描原始列表并使用三个引用:nanbnc。谁按原始列表的顺序排列。

现在您肯定知道nanbwhile 循环中有效。您首先通过将其存储在nc 中来确保您将保留对nb 的下一个引用。接下来将nb->next设置为na(原来na->nextnb),所以现在颠倒过来了。

然后你在这个过程中转变:na 变成旧的nbnb 旧的nc。您不断重复此操作,直到到达链表的末尾。

您需要执行两项额外的任务: - 将原来head->next设置为null,否则会构造循环;和 - 将原LinkedList的尾部设置为head

如果您维护tail,您首先需要将其设置为头部。

【讨论】:

  • 不能在终端运行吗?你的链表的源代码在哪里?然后人们也可以调试它......
  • 我正在使用 Dev-C++。当我运行程序时,它停止工作并打开一个名为 Makefile.win 的文件。我不知道该文件是什么或它为什么停止工作..即使其他函数编写正确:/
  • Makefile 是一个使用适当标志调用编译器的程序...
猜你喜欢
  • 1970-01-01
  • 2017-03-10
  • 2013-11-09
  • 2018-02-09
  • 2016-09-26
  • 1970-01-01
  • 1970-01-01
  • 2021-09-06
  • 1970-01-01
相关资源
最近更新 更多