LeetCode 24 两两交换链表节点:递归代码执行逻辑疑问
递归调用过程拆解(链表1->2->3->4->5)
你的预期是对的,head->next最终会指向值4的节点,而非3的节点,问题出在你可能混淆了递归调用的执行阶段和中间变量的实际指向。下面一步步拆解整个递归流程:
最底层调用:
swapPairs(5)- 传入的
head是值为5的节点,head->next为NULL,触发终止条件if(!head || !head->next),直接返回head(即值5的节点)。
- 传入的
中间调用:
swapPairs(3)- 传入的
head是值为3的节点,newHead是值为4的节点,newHead->next初始指向值5的节点。 - 执行
head->next = swapPairs(newHead->next):调用swapPairs(5)返回值5的节点,所以3的节点的next指向5。 - 执行
newHead->next = head:4的节点的next指向3的节点。 - 最后返回
newHead(值4的节点),此时该调用返回的链表是4->3->5。
- 传入的
初始调用:
swapPairs(1)- 传入的
head是值为1的节点,newHead是值为2的节点,newHead->next初始指向值3的节点。 - 执行
head->next = swapPairs(newHead->next):调用swapPairs(3)返回值4的节点,所以1的节点的next直接指向4的节点(不是3的节点)。 - 执行
newHead->next = head:2的节点的next指向1的节点。 - 最后返回
newHead(值2的节点),最终得到的完整链表是2->1->4->3->5。
- 传入的
疑惑点澄清
你误以为head->next会指向3的节点,是把newHead->next的初始指向和递归调用的返回值搞混了。newHead->next初始确实指向3的节点,但swapPairs(newHead->next)的返回值是处理后的子链表头(4的节点),所以head->next最终会被赋值为这个返回值,而非原来的3的节点。
内容的提问来源于stack exchange,提问作者Yang Ernie Chen
相关产品推荐
相关产品推荐

