您将获得一个双向链表,除了下一个和前一个指针之外,它还有一个子指针,可能指向单独的双向链表。这些子列表可能有一个或多个自己的子项,依此类推,生成多级数据结构,如下面的示例所示。
扁平化列表,使所有结点出现在单级双链表中。您将获得列表第一级的头部。
输入:
1—2---3—4---5—6–NULL
|
7—8---9—10–NULL
|
11–12–NULL
输出:
1-2-3-7-8-11-12-9-10-4-5-6-NULL
将其看成二叉树来思考,利用二叉树的深度优先先序遍历,将其next节点看成是二叉树的右节点,其child节点看成二叉树的左节点,依次遍历
递归优先搜索
"""
# Definition for a Node.
class Node:
def __init__(self, val, prev, next, child):
self.val = val
self.prev = prev
self.next = next
self.child = child
"""
class Solution:
def flatten(self, head: 'Node') -> 'Node':
#递归深度优先
if not head:
return head
pre_node = Node(0,None,head,None)
self.flatten_dfs(pre_node,head)
pre_node.next.prev = None
return pre_node.next
def flatten_dfs(self,pre_node,cur_node):
if not cur_node:
return pre_node
cur_node.prev = pre_node
pre_node.next = cur_node
temp_next = cur_node.next
tail = self.flatten_dfs(cur_node,cur_node.child)
cur_node.child = None
return self.flatten_dfs(tail,temp_next)
迭代深度优先搜索
"""
# Definition for a Node.
class Node:
def __init__(self, val, prev, next, child):
self.val = val
self.prev = prev
self.next = next
self.child = child
"""
class Solution:
def flatten(self, head: 'Node') -> 'Node':
if not head:
return
pre_node = Node(0,None,head,None)
prev = pre_node
stack = []
stack.append(head)
while stack:
cur = stack.pop()
prev.next = cur
cur.prev = prev
if cur.next:
stack.append(cur.next)
if cur.child:
stack.append(cur.child)
cur.child = None
prev = cur
pre_node.next.prev = None
return pre_node.next
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/flatten-a-multilevel-doubly-linked-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。