2022-7-31 剑指offer-链表-递归
多级双向链表中,除了指向下一个节点和前一个节点指针之外,它还有一个子链表指针,可能指向单独的双向链表。这些子列表也可能会有一个或多个自己的子项,依此类推,生成多级数据结构,如下面的示例所示。
给定位于列表第一级的头节点,请扁平化列表,即将这样的多级双向链表展平成普通的双向链表,使所有结点出现在单级双链表中。
1 /* 2 // Definition for a Node. 3 class Node { 4 public int val; 5 public Node prev; 6 public Node next; 7 public Node child; 8 }; 9 */ 10 11 class Solution { 12 public Node flatten(Node head) { 13 fla(head); 14 return head; 15 } 16 17 18 public void fla(Node head){ 19 if (head==null) return; 20 if (head.child!=null){ 21 Node nextNode=head.next; 22 fla(head.child); 23 head.next=head.child; 24 head.child.prev=head; 25 head.child=null; 26 while (head.next!=null){ 27 head=head.next; 28 } 29 if (nextNode!=null){ 30 head.next=nextNode; 31 nextNode.prev=head; 32 } 33 34 }else{ 35 fla(head.next); 36 } 37 } 38 }
思路:对于有child节点的,递归展开后,将末尾节点和下一个节点拼接上 ,再递归展开下一个节点。需要注意如果最后一个节点为空不需要拼接。