Reverse a LinkedList

Reverse a LinkedList

本文关键字:LinkedList Reverse      更新时间:2023-10-16

我试图反转一个链表,并将其保存到另一个新的点赞列表中,然后删除旧列表,但在编译时出错。。函数如下。。

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;
}

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

与其使用成本较低的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循环中是有效的。您首先通过将nb的next存储在nc中来确保保留对它的引用。接下来,将nb->next设置为na(最初的na->nextnb),因此现在它被反转。

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

您需要执行两项附加任务:-将原始head->next设置为null,否则将构造一个循环;和-将原始LinkedList的尾部设置为head

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