本文主要是介绍面试算法28:展平多级双向链表,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
问题
在一个多级双向链表中,节点除了有两个指针分别指向前后两个节点,还有一个指针指向它的子链表,并且子链表也是一个双向链表,它的节点也有指向子链表的指针。请将这样的多级双向链表展平成普通的双向链表,即所有节点都没有子链表。
分析
在面试时如果遇到这种类型的题目,应聘者需要先弄清楚展平的规则。在图4.14的示例中,节点2有一个子链表,展平之后该子链表插入节点2和它的下一个节点3之间。节点6也有一个子链表,展平之后该子链表插入节点6和它的下一个节点7之间。由此可知,展平的规则是一个节点的子链展平之后将插入该节点和它的下一个节点之间。
由于子链表中的节点也可能有子链表,因此这里的链表是一个递归的结构。在展平子链表时,如果它也有自己的子链表,那么它嵌套的子链表也要一起展平。嵌套子链表和外层子链表的结构类似,可以用同样的方法展平,因此可以用递归函数来展平链表。
解
public class Test {public static void main(String[] args) {Node node1 = new Node(1);Node node2 = new Node(2);Node node3 = new Node(3);Node node4 = new Node(4);Node node5 = new Node(5);Node node6 = new Node(6);Node node7 = new Node(7);Node node8 = new Node(8);Node node9 = new Node(9);node1.next = node2;node2.prev = node1;node2.child = node5;node2.next = node3;node3.prev = node2;node3.next = node4;node4.prev = node3;node5.next = node6;node6.prev = node5;node6.child = node8;node6.next = node7;node7.prev = node6;node8.next = node9;node9.prev = node8;Node result = flatten(node1);while (result != null) {System.out.println(result.val);result = result.next;}}public static Node flatten(Node head) {flattenGetTail(head);return head;}private static 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;}
}
这篇关于面试算法28:展平多级双向链表的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!