【问题标题】:reverse a linked list? [duplicate]反转链表? [复制]
【发布时间】:2010-05-22 09:41:13
【问题描述】:

我正在尝试反转以下链表的顺序,我已经这样做了,但是反转的列表似乎没有打印出来。我哪里做错了?

//reverse the linked list
    #include <iostream>
    using namespace std;

    struct node{
        int number;
        node *next;
    };

    node *A;

    void addNode(node *&listpointer, int num){
        node *temp;
        temp = new node;
        temp->number = num;
        temp->next = listpointer;
        listpointer = temp;
    }

    void reverseNode(node *&listpointer){
        node *temp,*current;
        current = listpointer;
        temp = new node;
        while (true){
            if (current == NULL){
                temp = NULL;
                break;
            }
            temp->number = current->number;
            current = current->next;
            temp = temp->next;
        }
        listpointer = temp;
    }

    int main(){
        A = NULL;
        addNode(A,1);
        addNode(A,2);
        addNode(A,3);

        while (true){
            if (A == NULL){break;}
            cout<< A->number << endl;
            A = A->next;
        }
        cout<< "****" << endl;
        reverseNode(A);

        while (true){
            if (A == NULL){break;}
            cout<< A->number << endl;
            A = A->next;
        }

        cout<< "****"<< endl;

        return 0;
    }

【问题讨论】:

  • 我想这是家庭作业。那么,您可以使用双向链表和/或递归吗?
  • 不是作业,但我需要知道如何在途中的某个地方完成它

标签: c++ gcc linked-list reverse


【解决方案1】:

嗯,我注意到的第一件事就是你在做

temp = 新节点

然后,在每次互动中:

temp = temp->下一个

但你永远不会分配 temp->next

所以当你最终覆盖列表指针时,你肯定会返回一些有趣的值。

【讨论】:

【解决方案2】:

你这样做:

while (true){
    if (current == NULL){
        temp = NULL;
        break;
    }
    temp->number = current->number;
    current = current->next;
    temp = temp->next;
}

假设它按您的预期工作。当 while 存在时,temp 将是 NULL,对吧?

listpointer = temp; <=> listpointer = NULL;

所以这可能是个问题。

【讨论】:

    【解决方案3】:

    不检查你的代码我问你这个,你确定你的链表工作吗?

    【讨论】:

    • yup链表工作正常,只需要反馈reverseNode功能
    • 链表似乎在开头插入了项目。我不确定这是不是故意的。
    【解决方案4】:
    void reverse(Node** list) {
        Node* previous=NULL;
        Node* current=*list;
        while (NULL!=current) {
            std::swap(previous, current->next);
            std::swap(previous, current);
        }
        *list=previous;
    }
    

    【讨论】:

      【解决方案5】:

      为什么不:

      1. 测量列表的长度

      2. 用零填充附加列表,直到达到现有列表大小的两倍

      3. 转到列表的开头,

      4. 逐一阅读内容,直到到达原始列表的末尾

      5. 在原名单上移动时:

      6. 将当前节点的内容复制到指针前移的节点中

        ((原始列表长度 - 当前节点索引) * 2 + 1 ) * 节点大小

      7. 完成后,获取原始列表后第一个节点的指针,指向反向列表

      无需创建新列表或进行多次迭代或修改现有数据结构(不将其转换为双链表)

      【讨论】:

      • 1、2 和 4 所花费的时间都与列表的大小成正比。 2 占用与它成比例的内存。此外,#6 似乎需要向后移动或反复迭代到所需的索引(二次)。我不认为这个算法是合理的。
      • 应该是这样的 node+((max-idx)*2+1)*sizeof(node)=node->number;节点++;
      • 你不能做指针运算。这是一个链表。此外,指针算法会为您处理 sizeof
      猜你喜欢
      • 2017-03-10
      • 2013-11-09
      • 1970-01-01
      • 2016-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多