LCR 028
题目: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) {//连接childcur.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
节点置空,否则测试不通过