def flatten(self, head):
"""
:type head: Node
:rtype: Node
"""
def dfs(head):
p = head
last = None
while p:
nxt = p.next #这个还有个功能是用来记录递归在归的时候遍历的起点的,相当于跨过了子链表
if p.child:
child_l = dfs(p.child)
end = p.next
p.next = p.child
p.child.prev = p
if end:
child_l.next = end
end.prev = child_l
p.child = None
last = child_l #正是上面的因为跨过了子链表,所以last也要跨到子链表的最后一个节点,不然如果有哪个子链表连接子子链表的节点是最后一个的话,last就得不到更新,导致出错
else:
last = p
p = nxt #这个会跳过子链表的所有节点,不会重新遍历
return last
dfs(head)
return head
不跨的对比,这样p会再次遍历子链表,last也会随着p一步步更新,就不用last= child_l这句了。
def flatten(self, head):
"""
:type head: Node
:rtype: Node
"""
def dfs(head):
p = head
last = None
while p:
nxt = p.next
if p.child:
child_l = dfs(p.child)
end = p.next
p.next = p.child
p.child.prev = p
if end:
child_l.next = end
end.prev = child_l
p.child = None
#last = child_l
else:
last = p
p = p.next #这个会跳过子链表的所有节点,不会重新遍历
return last
dfs(head)
return head