LeetCode扁平化多级双向链表解法保存head.next的作用详解
问题解答
覆盖发生的具体逻辑
这段递归解法依赖全局变量pre记录上一个已处理完成的节点,处理子链时会自动修改父节点的next指针,具体覆盖过程如下:
- 在调用
flatten(head.child)之前,刚执行完pre = head赋值,此时pre指向当前正在处理的父节点 - 进入
flatten(head.child)的递归逻辑后,只要child不为空,就会触发指针绑定逻辑:
if (pre != null) { pre.next = head; // 这里的pre是父节点,head是child链表的第一个节点 head.prev = pre; }
- 这一步执行完成后,父节点原本的
next值(同级的下一个节点)就被直接覆盖为child节点,原始的next引用直接丢失。
提前保存head.next的必要性
如果没有提前把原始head.next存入临时变量next,当child整条子链处理完成后,你就无法再获取到当前节点原本的同级后续节点,后续的flatten(next)调用就无法执行,会直接丢失所有原本在当前节点后面的同级节点以及它们的子链。
举个简单的示例验证:假设存在节点A,A的next是同级节点B,A的child是子节点C。如果不提前保存A的next:
- 处理A时,
pre赋值为A,直接调用flatten(C) - 递归处理C时会把A的
next修改为C,此时原本A指向B的引用被覆盖丢失 - 处理完C的整条子链后,无法再找到B节点,最终的扁平化结果会缺失B以及B之后的所有节点。
提前保存head.next就是为了在父节点next被修改前,把原始的同级后续节点引用留存下来,保证所有层级的所有节点都能被完整遍历拼接,不会出现节点丢失的问题。
内容的提问来源于stack exchange,提问作者Rishikrishna
相关产品推荐
相关产品推荐

