移除链表中元素,递归方法是怎么回事(三克油)

链接: https://leetcode-cn.com/problems/remove-linked-list-elements https://leetcode-cn.com/problems/remove-linked-list-elements

疑问:递归的这条语句struct ListNode* res = removeElements(head->next, val);是怎么做到删除数据域为val的结点的啊,到最后递归递归不是就走return NULL了吗

(力扣203),给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
代码:

struct ListNode* removeElements(struct ListNode* head, int val){ 
    if (head == NULL) {
        return NULL;
    }     

    /* 删除原链表中头节点后面值为 val 的元素的节点 */
    struct ListNode* res = removeElements(head->next, val);
    /* 原链表头节点也是要删除的节点 */
    if (head->val == val) {
        return res;
    /* 原链表头节点不是要删除的节点,将原链表中头节点后面挂接的更短的链表已删除值
       为 val 的节点的链表挂接在原链表的头节点后面 */
    } else {
        head->next = res;
        return head;
    }
}

晓得了,有同样困扰的小伙伴,看看这句话能不能帮到你:递归调用时可以把它分为一级一级的,当到达临界条件后,返回的过程中,当某一级递归结束,则该级函数马上将程序的控制权交给该函数的调用函数(执行函数里未执行的内容)。(在搜集资料后,自己理解的,有不当地方,还望及时指出