diff --git a/src/main/java/com/code/leet/entiy/Node.java b/src/main/java/com/code/leet/entiy/Node.java index 2e61fb5..ad14988 100644 --- a/src/main/java/com/code/leet/entiy/Node.java +++ b/src/main/java/com/code/leet/entiy/Node.java @@ -22,6 +22,13 @@ public class Node { this.random = random; } + public Node(int val, Node prev, Node next, Node child) { + this.val = val; + this.prev = prev; + this.next = next; + this.child = child; + } + public Node setHead(List list, List index) { Node head = new Node(list.get(0)); int i = 1; diff --git a/src/main/java/leetcode/editor/cn/FlattenAMultilevelDoublyLinkedList.java b/src/main/java/leetcode/editor/cn/FlattenAMultilevelDoublyLinkedList.java new file mode 100644 index 0000000..77a80e9 --- /dev/null +++ b/src/main/java/leetcode/editor/cn/FlattenAMultilevelDoublyLinkedList.java @@ -0,0 +1,139 @@ +//多级双向链表中,除了指向下一个节点和前一个节点指针之外,它还有一个子链表指针,可能指向单独的双向链表。这些子列表也可能会有一个或多个自己的子项,依此类推,生 +//成多级数据结构,如下面的示例所示。 +// +// 给你位于列表第一级的头节点,请你扁平化列表,使所有结点出现在单级双链表中。 +// +// +// +// 示例 1: +// +// 输入:head = [1,2,3,4,5,6,null,null,null,7,8,9,10,null,null,11,12] +//输出:[1,2,3,7,8,11,12,9,10,4,5,6] +//解释: +// +//输入的多级列表如下图所示: +// +// +// +//扁平化后的链表如下图: +// +// +// +// +// 示例 2: +// +// 输入:head = [1,2,null,3] +//输出:[1,3,2] +//解释: +// +//输入的多级列表如下图所示: +// +// 1---2---NULL +// | +// 3---NULL +// +// +// 示例 3: +// +// 输入:head = [] +//输出:[] +// +// +// +// +// 如何表示测试用例中的多级链表? +// +// 以 示例 1 为例: +// +// 1---2---3---4---5---6--NULL +// | +// 7---8---9---10--NULL +// | +// 11--12--NULL +// +// 序列化其中的每一级之后: +// +// [1,2,3,4,5,6,null] +//[7,8,9,10,null] +//[11,12,null] +// +// +// 为了将每一级都序列化到一起,我们需要每一级中添加值为 null 的元素,以表示没有节点连接到上一级的上级节点。 +// +// [1,2,3,4,5,6,null] +//[null,null,7,8,9,10,null] +//[null,11,12,null] +// +// +// 合并所有序列化结果,并去除末尾的 null 。 +// +// [1,2,3,4,5,6,null,null,null,7,8,9,10,null,null,11,12] +// +// +// +// 提示: +// +// +// 节点数目不超过 1000 +// 1 <= Node.val <= 10^5 +// +// Related Topics 深度优先搜索 链表 +// 👍 199 👎 0 + +package leetcode.editor.cn; + +import com.code.leet.entiy.Node; + +//430:扁平化多级双向链表 +public class FlattenAMultilevelDoublyLinkedList { + public static void main(String[] args) { + //测试代码 + Solution solution = new FlattenAMultilevelDoublyLinkedList().new Solution(); + } + //力扣代码 + //leetcode submit region begin(Prohibit modification and deletion) +/* +// Definition for a Node. +class Node { + public int val; + public Node prev; + public Node next; + public Node child; +}; +*/ + + class Solution { + public Node flatten(Node head) { + if (head == null) { + return head; + } + // pseudo head to ensure the `prev` pointer is never none + Node pseudoHead = new Node(0, null, head, null); + + flattenDFS(pseudoHead, head); + + // detach the pseudo head from the real head + pseudoHead.next.prev = null; + return pseudoHead.next; + } + + /* return the tail of the flatten list */ + public Node flattenDFS(Node prev, Node curr) { + if (curr == null) { + return prev; + } + curr.prev = prev; + prev.next = curr; + + // the curr.next would be tempered in the recursive function + Node tempNext = curr.next; + + Node tail = flattenDFS(curr, curr.child); + curr.child = null; + + return flattenDFS(tail, tempNext); + } + } +//leetcode submit region end(Prohibit modification and deletion) + +} \ No newline at end of file diff --git a/src/main/java/leetcode/editor/cn/FlattenAMultilevelDoublyLinkedList.md b/src/main/java/leetcode/editor/cn/FlattenAMultilevelDoublyLinkedList.md new file mode 100644 index 0000000..5db7d3c --- /dev/null +++ b/src/main/java/leetcode/editor/cn/FlattenAMultilevelDoublyLinkedList.md @@ -0,0 +1,79 @@ +

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

+ +

给你位于列表第一级的头节点,请你扁平化列表,使所有结点出现在单级双链表中。

+ +

 

+ +

示例 1:

+ +
输入:head = [1,2,3,4,5,6,null,null,null,7,8,9,10,null,null,11,12]
+输出:[1,2,3,7,8,11,12,9,10,4,5,6]
+解释:
+
+输入的多级列表如下图所示:
+
+
+
+扁平化后的链表如下图:
+
+
+
+ +

示例 2:

+ +
输入:head = [1,2,null,3]
+输出:[1,3,2]
+解释:
+
+输入的多级列表如下图所示:
+
+  1---2---NULL
+  |
+  3---NULL
+
+ +

示例 3:

+ +
输入:head = []
+输出:[]
+
+ +

 

+ +

如何表示测试用例中的多级链表?

+ +

示例 1 为例:

+ +
 1---2---3---4---5---6--NULL
+         |
+         7---8---9---10--NULL
+             |
+             11--12--NULL
+ +

序列化其中的每一级之后:

+ +
[1,2,3,4,5,6,null]
+[7,8,9,10,null]
+[11,12,null]
+
+ +

为了将每一级都序列化到一起,我们需要每一级中添加值为 null 的元素,以表示没有节点连接到上一级的上级节点。

+ +
[1,2,3,4,5,6,null]
+[null,null,7,8,9,10,null]
+[null,11,12,null]
+
+ +

合并所有序列化结果,并去除末尾的 null 。

+ +
[1,2,3,4,5,6,null,null,null,7,8,9,10,null,null,11,12]
+ +

 

+ +

提示:

+ + +
Related Topics
  • 深度优先搜索
  • 链表
  • \n
  • 👍 199
  • 👎 0
  • \ No newline at end of file