一、题目
多级双向链表中,除了指向下一个节点和前一个节点指针之外,它还有一个子链表指针,可能指向单独的双向链表。这些子列表也可能会有一个或多个自己的子项,依此类推,生成多级数据结构,如下面的示例所示。
给你位于列表第一级的头节点,请你扁平化列表,使所有结点出现在单级双链表中。
点击查看原题
难度级别: 中等
二、思路
1)DFS
优先遍历孩子链表,将next
链表链接在孩子链表尾部
使用dfs
函数,认为dfs
函数会返回该链表的尾部节点,拿到尾部链表节点后,插入在当前遍历节点cur
和cur.next
中间即可
三、代码
1)DFS
class Solution {
public Node flatten(Node head) {
dfs(head);
return head;
}
public Node dfs(Node head) {
Node cur = head, last = head; // 当前遍历的节点cur,当前链表的尾节点last
while (cur != null) {
if (cur.child != null) {
Node childLast = dfs(cur.child); // 获取孩子节点的尾节点
Node childHead = cur.child;
cur.child = null;
if (cur.next != null) { // 链接孩子尾部节点和cur.next节点
childLast.next = cur.next;
cur.next.prev = childLast;
}
cur.next = childHead; // 链接cur节点和孩子头节点
childHead.prev = cur;
cur = childLast;
}
last = cur;
cur = cur.next;
}
return last;
}
}
时间复杂度为O(n)
,假设最深孩子深度为m
,空间复杂度为O(m)