题目:

在一个多级双向链表中,节点除了有两个指针分别指向前后两个节点,还有一个指针指向它的子链表,并且子链表也是个双向链表,它的节点也有指向子链表的指针。请将这样的多级双向链表展平成普通的双向链表,也就是所有节点都没有子链表。

剑指offer28:展平多级双向链表_链表


分析:

如图所示,一个节点的子链展平以后将插入该节点和它的下一个节点之间,子链表的节点中可能还有子链表,因此这里的链表是一个递归结构。

解析直接看下图:

tail指针目的就是指向平铺双链表的末尾。

剑指offer28:展平多级双向链表_双向链表_02


还有特殊情况需要考虑,例如下图,tail已经到达该递归层最末尾了,但它不是整个平铺链表的最末尾,而childtail(CT)却是平铺链表结尾,因此我们在判断tail在哪时,先将tail指向CT,如果node的下一个节点不是空,tail再指向node的下一个节点,下一个节点是空的话tail指针就不用动了。

剑指offer28:展平多级双向链表_链表_03

public class Fatten {
public Node flatten(Node head) {
flattenGetTail(head);
return head;
}
public Node flattenGetTail(Node head){
Node node = head;
Node tail = null;
while (node!= null){
Node next = node.next;
if (node.child !=null){
Node child = node.child;
Node childTail = flattenGetTail(node.child);
node.child = null;
node.next = child;
child.prev = node;
childTail.next = next;
if (next != null){
next.prev = childTail;
}
tail = childTail;
}else {
tail = node;
}
node = next;
}
return tail;
}
}

剑指offer28:展平多级双向链表_双向链表_04


时间复杂度为O(nk),k是嵌套层数,n是链表总节点数。