题目:LCR 028
解法一:深度优先搜索
遍历链表,若某节点存在子链,则遍历子链,遍历完后,返回子链最后一个节点 last
,将 last
与当前链表的 next
相连
public Node flatten(Node head) {
dfs(head);
return head;
}
public Node dfs(Node head) {
Node cur = head, last = null, next = null;
while (cur != null) {
last = cur;
next = cur.next;
//连接孩子节点,更新last,并把last和next相连
if (cur.child != null) {
//连接child
cur.next = cur.child;
cur.child.prev = cur;
//获取子链尾节点
last = dfs(cur.child);
//将子节点置空
cur.child = null;
//将子链尾节点和下一个节点相连
last.next = next;
if (next != null) next.prev = last;
}
//此处不能用cur=cur.next,因为此时cur的next已经被修改为孩子节点
cur = next;
}
return last;
}
注意:
-
当
next
为空时,只需要将last
的next
指针指向next
,不需要将next
的prev
指针指向last
-
扁平化子链后,需要将
child
节点置空,否则测试不通过