我有以下功能来反转链表:
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
都会更新头指针。它应该最终指向反向链表的新开始,并且应该在递归调用返回时保持不变。但是它似乎在返回路径上不断更新。
答案 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)