📅  最后修改于: 2023-12-03 14:53:57.333000             🧑  作者: Mango
在多级链表中,每个节点中可能还会包含一个子列表。展平多级链表就是将这个子列表挪到父节点之后,使得整个链表仅包含节点没有子列表。
考虑一个多级链表的例子:
1---2---3---4---5---6--NULL
|
7---8---9---10--NULL
|
11--12--NULL
在这个例子中,节点7拥有一个子列表,其中包含节点11和节点12。我们希望将它们都挪到父节点7的后面,形成以下链表:
1---2---3---4---5---6---7---8---9---10--11--12--NULL
我们可以采用深度优先搜索对多级链表进行遍历。具体地,首先将链表的头节点作为当前遍历的节点,然后判断它是否有子列表。若有,则先递归遍历子列表,按照深度优先的顺序访问子节点,直到子节点没有子列表。然后回溯到当前节点,将子列表转化成链表,并与当前节点的后继节点连接。
具体代码如下:
# Definition for a Node.
class Node:
def __init__(self, val=None, prev=None, next=None, child=None):
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
curr = head
while curr:
if curr.child:
next_ptr = curr.next
child_ptr = curr.child
curr.next = self.flatten(child_ptr)
curr.child = None
curr.next.prev = curr
while curr.next:
curr = curr.next
curr.next = next_ptr
if next_ptr:
next_ptr.prev = curr
curr = curr.next
return head