0

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

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

5 回答 5

3

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

temp = 新节点

然后,在每次互动中:

temp = temp->下一个

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

因此,当您最终覆盖列表指针时,您肯定会返回一些有趣的值。

于 2010-05-22T09:49:20.863 回答
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;

所以这可能是个问题。

于 2010-05-22T09:51:21.767 回答
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;
}
于 2013-03-13T08:41:16.080 回答
0

在不检查您的代码的情况下,我问您这个问题,您确定您的链表正在工作吗?

于 2010-05-22T09:49:09.380 回答
-1

为什么不 :

  1. 测量列表的长度

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

  3. 转到列表的开头,

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

  5. 在原始列表上移动时:

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

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

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

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

于 2010-05-22T10:06:51.927 回答