You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LeetCode 24 两两交换链表节点:递归代码执行逻辑疑问

递归调用过程拆解(链表1->2->3->4->5)

你的预期是对的,head->next最终会指向值4的节点,而非3的节点,问题出在你可能混淆了递归调用的执行阶段和中间变量的实际指向。下面一步步拆解整个递归流程:

  1. 最底层调用:swapPairs(5)

    • 传入的head是值为5的节点,head->next为NULL,触发终止条件if(!head || !head->next),直接返回head(即值5的节点)。
  2. 中间调用: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。
  3. 初始调用: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 07:57:32