如何在C ++中通过void和non void递归函数传递指针

时间:2015-08-05 19:45:38

标签: c++ pointers recursion

我有以下功能来反转链表:

Node* reverseUtil(Node *head, Node *prev) {
    if (head->next == NULL) {
        head->next = prev;
        return head;
    }
    Node *next = head->next;
    head->next = prev;
    prev = head;
    head = next;
    return reverseUtil(head, prev);
}

当我用Node* head = reverseUtil(head, NULL);调用它时,它工作正常并最终返回反向链表的头部。对于1-> 2-> 3的实例,它返回具有3-> 2-> 1的头部。

但是,当我将其修改为以下内容时,结果头指针只有反向链表的最后一个节点(最初是列表的起始点。例如:原始列表1-> 2-> 3 ,最后只有1。

void reverseUtil(Node *head, Node *prev) {
    if (head->next == NULL) {
        head->next = prev;
        return;
    }
    Node *next = head->next;
    head->next = prev;
    prev = head;
    head = next; //head pointer should update here on forward path. This seems to be happening.
    reverseUtil(head, prev);//after this step returns, head should stick to the last updated point and should return unchanged but this does not happen.
}

我想我错过了一些基本的东西。我希望每次调用函数时声明head = next都会更新头指针。它应该最终指向反向链表的新开始,并且应该在递归调用返回时保持不变。但是它似乎在返回路径上不断更新。

1 个答案:

答案 0 :(得分:1)

当您将指针传递给类似 CREATE TABLE `users` ( `user_id` INT(11) NOT NULL AUTO_INCREMENT , `username` VARCHAR(45) , `password` VARCHAR(100) , `email` VARCHAR(45) , `friend_count` INT(11) , `profile_pic` VARCHAR(150), PRIMARY KEY (`user_id`)); 的函数时,指针包含的地址将按值传递。如果您需要更改该地址,则需要通过CREATE TABLE `updates` ( `update_id` INT(11) AUTO_INCREMENT , `update` VARCHAR(45), `user_id_fk` VARCHAR(45), `created` INT(11) , `ip` VARCHAR(45), PRIMARY KEY (`update_id`), FOREIGN KEY (user_id_fk) REFERENCES users(user_id)); 之类的引用传递该地址。我认为你很困惑这个工作的事实

void foo(type* bar)

这里我们没有改变指针指向的内容,但是我们正在改变指向对象的值。我们可以看到,当没有通过引用传递时,更改指针的地址没有影响:

void foo(type *&bar)

String#split()