反转链表?

时间:2010-05-22 09:41:13

标签: c++ gcc linked-list reverse

我试图颠倒以下链接列表的顺序,我已经这样做了,但反向列表似乎没有打印出来。我哪里出错了?

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

5 个答案:

答案 0 :(得分:3)

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

temp =新节点

然后,在每次互动中:

temp = temp-&gt; next

但你永远不会分配temp-&gt; next

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

答案 1 :(得分:1)

你这样做:

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

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

listpointer = temp; <=> listpointer = NULL;

所以这可能是个问题。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

void reverse(Node** list) {
    Node* previous=NULL;
    Node* current=*list;
    while (NULL!=current) {
        std::swap(previous, current->next);
        std::swap(previous, current);
    }
    *list=previous;
}

答案 4 :(得分:-1)

为什么不:

  1. 衡量列表的长度

  2. 用零填充您的列表,直到您的现有列表的大小增加一倍

  3. 转到列表的开头,

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

  5. 移动原始列表时
  6. 将当前节点的内容复制到指针前进的节点

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

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

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