2022-7-31 剑指offer-链表-递归

剑指 Offer II 028. 展平多级双向链表

难度中等

多级双向链表中,除了指向下一个节点和前一个节点指针之外,它还有一个子链表指针,可能指向单独的双向链表。这些子列表也可能会有一个或多个自己的子项,依此类推,生成多级数据结构,如下面的示例所示。

给定位于列表第一级的头节点,请扁平化列表,即将这样的多级双向链表展平成普通的双向链表,使所有结点出现在单级双链表中。

 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节点的,递归展开后,将末尾节点和下一个节点拼接上 ,再递归展开下一个节点。需要注意如果最后一个节点为空不需要拼接。

posted on 2022-07-31 13:44  阿ming  阅读(16)  评论(0编辑  收藏  举报

导航