如何使用JavaScript从数组创建双向链表(LeetCode多级双向链表扁平化场景)
如何从数组创建合法的双向链表
我明白你现在的核心需求是把已经整理好的数组转换成一个合法的双向链表——也就是让每个节点的prev和next指针都正确指向相邻节点,同时把所有节点的child置为null。你的数组内容是完全正确的,但之前构建链表时prev指针的逻辑有点混乱,导致最终的链表结构不合法。下面我给你两种清晰的实现方式:
方法一:从后往前构建(适配你原来的思路)
你之前尝试从数组末尾开始构建,但错误地嵌套了遍历原链表的逻辑,导致prev指针指向完全错误。正确的做法是,每次创建新节点时,同时维护好当前节点和上一个节点的双向关联:
// 假设array是你已经整理好的目标数组 let array = [1, 2, 3, 7, 8, 11, 12, 9, 10, 4, 5, 6]; let resultList = null; let prevNode = null; // 从数组末尾往前遍历 for (let i = array.length - 1; i >= 0; i--) { // 创建新节点,next指向之前构建好的链表部分 const newNode = { val: array[i], next: resultList, prev: prevNode, child: null // 必须置为null }; // 如果之前已经有节点,要把那个节点的prev指向当前新节点 if (resultList) { resultList.prev = newNode; } // 更新resultList为当前新节点,prevNode也更新为当前节点 resultList = newNode; prevNode = newNode; }
这种方式的核心是:每创建一个新节点,不仅要让它的next指向之前的链表头,还要让之前的链表头的prev指向这个新节点,形成双向绑定。
方法二:从前往后构建(更直观易理解)
如果你觉得从后往前容易搞混,从前往后构建会更符合直觉:
let array = [1, 2, 3, 7, 8, 11, 12, 9, 10, 4, 5, 6]; if (array.length === 0) return null; // 处理空数组情况 // 创建头节点 let head = { val: array[0], prev: null, next: null, child: null }; let current = head; // 从第二个元素开始遍历 for (let i = 1; i < array.length; i++) { const newNode = { val: array[i], prev: current, // 新节点的prev指向当前节点 next: null, child: null }; current.next = newNode; // 当前节点的next指向新节点 current = newNode; // 移动current到新节点,继续下一个 }
这种方式一步一步把每个新节点挂到当前链表的末尾,同时维护好prev和next的双向关联,逻辑更清晰,也不容易出错。
对你原有代码的问题分析
你原来的代码里,在for循环中嵌套了while(head)的遍历,这完全没必要——原链表已经被你转换成数组了,构建新链表只需要用数组即可。而且你在循环里重复修改resultList.prev,导致最终的prev指针指向了原链表的最后一个节点,而不是新链表的前一个节点,这就是为什么你的输出里prev指向了val:5的节点,而不是正确的前一个节点。
内容的提问来源于stack exchange,提问作者Harsh Mishra
相关产品推荐
相关产品推荐

