c++ 如何确保函数的输入值在作为指针传递时不会改变?

wn9m85ua  于 2023-05-30  发布在  其他
关注(0)|答案(1)|浏览(129)

指针在不同函数中的行为不同。
我创建了一个C++程序,可以打印和反转一个链表。我不明白为什么指针在pprint()函数中的行为与在reverse()函数中的行为不同。请看下面的代码。

#include <iostream>

struct Node{
    int data;
    Node* next;
    Node(int x):data(x),next(nullptr){};
    Node():data(0),next(nullptr){};
    Node(int x, Node* next): data(x),next(next){};
};

class LinkedList{
    public:
        void pprint(Node* head);
        Node* reverse(Node* head);
};

Node* LinkedList::reverse(Node* head){
    Node* curr = head;
    Node* next = NULL;
    Node* prev = NULL;

    while(curr!=NULL){
        next = curr->next;
        curr->next = prev;

        prev = curr; 
        curr= next; 
    }
    return prev; 
}

void LinkedList::pprint(Node* head){
    Node* curr = head;
    while(curr!=NULL){
        std::cout<<curr->data<<std::endl;
        curr =  curr->next;
    }
}

int main(){
    Node* a = new Node(); 
    Node* b = new Node();
    Node* c = new Node();

    a->data = 1;
    b->data = 2;
    c->data = 3;
    c->next = NULL; 
    b->next = c; 
    a->next = b;
    
    LinkedList LL; 
    LL.pprint(a);
    std::cout<<""<<std::endl;
    LL.pprint(LL.reverse(a));
    std::cout<<""<<std::endl;
    LL.pprint(a);
    return 0;
}

我希望得到以下输出:

1
2
3

3
2
1

1
2
3

但是我得到了以下输出:

1
2
3

3
2
1

1

对于pprint()函数,我传递head指针作为输入,并将其分配给curr变量。在函数结束时,head值仍然指向a。但在reverse()函数中,a值已成为头部。我该如何纠正这个问题?

4ktjp1zp

4ktjp1zp1#

您正确地反转了链表,但是在反转之后,您没有更新头指针以指向反转列表的新头。
试试这个:

int main() {      
    Node* a = new Node(1);
    Node* b = new Node(2);
    Node* c = new Node(3);
     
    a->next = b;
    b->next = c;
    c->next = nullptr;    
    
    LinkedList LL;
    LL.pprint(a);
    std::cout << std::endl;

    // Reverse the list and update the head pointer
    a = LL.reverse(a);
       
    LL.pprint(a);
    std::cout << std::endl;
       
    LL.pprint(a);

    return 0;
}

相关问题