反转链接列表

时间:2015-03-02 19:26:36

标签: c++ linked-list reverse

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

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;

}

1 个答案:

答案 0 :(得分:1)

如果(且仅当)您不再需要原始链接列表,请使用此选项!

不是使用便宜的addAtFront(因为你需要为新节点分配内存并销毁旧节点),而是重用节点和{{1} (毕竟,你打算删除原来的,只需设置指针:

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; } nanb。谁按原始列表的顺序组织。

现在您确定ncnanb循环中有效。首先,请确保通过将其存储在while中来保留对nb的引用。接下来,您将nc的{​​{1}}设置为->next(最初nbna),现在它已被撤消。

然后你转移过程:na->next变为旧的nbnanb。你不断重复这个,直到你到达链表的末尾。

您需要完成两项额外任务:   - 将原始nb' s nc设置为head,否则您将构建一个周期;和   - 将原始->next的尾部设置为null

如果你保持LinkedList,首先需要将其设置为头部。