首页 > 解决方案 > 当用作返回值时,临时堆栈分配的指针会发生什么?

问题描述

我正在做一些基本的 leetcode 问题。在这里,我尝试使用递归交换成对的单链表。下面的代码通过了测试,但有些地方让我无法理解。new_head是在堆栈上创建的指针。我理解这意味着一旦函数返回它就会被清理并可能指向垃圾。假设它在这里“偶然”起作用并且不是正确的方法是正确的,还是我的理解错误?

/**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     struct ListNode *next;
     * };
     */
    
        struct ListNode* swapPairs(struct ListNode* head){
            
        if (head == NULL || head->next == NULL) {
            return head;
        }    
            
            struct ListNode* new_head;
        
            new_head = head->next;       
            head->next = swapPairs(head->next->next);
            new_head->next = head;
          
            return new_head;
        
                        
        }

与上述代码相关的另一个问题:

如果我更改分配的顺序,我会得到堆栈溢出,但我无法理解为什么

        new_head = head->next;
        new_head->next = head;       
        head->next = swapPairs(head->next->next);

这条线new_head->next = head;中没有涉及到的任何内容都不会影响递归中发生的事情 no (它必须有,但我错过了它)?

标签: crecursionmemory-managementsingly-linked-list

解决方案


第一个问题

Returnreturn new_head;不会将对象返回new_head给调用者。它将当前值返回new_head给调用者。没事儿。

第二个问题

和:

new_head = head->next;       
head->next = swapPairs(head->next->next);
new_head->next = head;

swapPairs被调用时,传递给它的值head->next->next是列表中某个节点之外的地址head->next

和:

new_head = head->next;
new_head->next = head;       
head->next = swapPairs(head->next->next);

swapPairs被调用时,传递给它的值head->next->nexthead,因为new_head->next = head;刚刚设置head->next->nexthead


推荐阅读