扁平化多级双向链表
难度:
标签:
题目描述
English description is not available for the problem. Please switch to Chinese.
代码结果
运行时间: 25 ms, 内存: 16.7 MB
// Java Stream Solution
// 思路:
// 使用递归和流的思想,将每一个节点及其子节点展平成列表。
import java.util.ArrayList;
import java.util.List;
class Node {
public int val;
public Node prev;
public Node next;
public Node child;
public Node(int val) {
this.val = val;
this.prev = null;
this.next = null;
this.child = null;
}
}
public class Solution {
public Node flatten(Node head) {
List<Node> nodeList = new ArrayList<>();
flattenToList(head, nodeList);
Node pseudoHead = new Node(0);
Node curr = pseudoHead;
for (Node node : nodeList) {
curr.next = node;
node.prev = curr;
curr = curr.next;
curr.child = null;
}
pseudoHead.next.prev = null;
return pseudoHead.next;
}
private void flattenToList(Node head, List<Node> nodeList) {
if (head == null) return;
nodeList.add(head);
flattenToList(head.child, nodeList);
flattenToList(head.next, nodeList);
}
}
解释
方法:
题解采用的是深度优先遍历(DFS)的迭代实现,利用栈(在代码中是stash列表)来管理还未完全扁平化的节点。首先创建一个虚拟头节点dummy来简化边界条件处理,然后使用一个循环遍历所有节点。对于每个节点,如果它具有子节点,将其子节点插入到当前节点的下一个位置,并将原来的next节点压入栈中。如果当前节点没有next节点,且栈中还有节点,从栈中弹出一个节点作为next节点。继续这个过程,直到所有节点都被遍历完,从而实现链表的完全扁平化。
时间复杂度:
O(n)
空间复杂度:
O(n)
代码细节讲解
🦆
在处理多级双向链表的扁平化时,为什么选择使用栈(DFS)而不是队列(BFS)?
▷🦆
在将子节点连接为当前节点的下一个节点时,原本的next节点是如何处理确保不丢失的?
▷🦆
代码中使用了虚拟头节点dummy,这种做法的主要优点是什么?
▷