leetcode430. 扁平化多级双向链表

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值