一、题目描述
多级双向链表中,除了指向下一个节点和前一个节点指针之外,它还有一个子链表指针,可能指向单独的双向链表。这些子列表也可能会有一个或多个自己的子项,依此类推,生成多级数据结构,如下面的示例所示。
给定位于列表第一级的头节点,请扁平化列表,即将这样的多级双向链表展平成普通的双向链表,使所有结点出现在单级双链表中。
输入: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]
解释:
输入的多级列表如下图所示:
扁平化后的链表如下图:
二、代码思路
dfs即可,但是注意递归时候的一些细节,也就是把题目的要求读清楚,需要的条件,返回值要看完整,防止自己一直丢条件。
调试工具用好
三、代码思路
/*
// Definition for a Node.
class Node {
public int val;
public Node prev;
public Node next;
public Node child;
};
*/
class Solution {
private List<Node> list = new ArrayList();
private void findNode(Node head) {
Node headCopy = head;
if(head != null) list.add(head);
if(head.child != null) {
Node temp = head.child;
head.child = null;
//一定要对head做一个备份,否则下方还有一个对head的判断,如果这里把head变更了,那么下方判断的head就变化了
//所以在递归的时候一定要注意
headCopy = head;
//丢了一个pre前指针的构造
temp.prev = head;
head = temp;
findNode(head);
}
if(/*head.child == null &&*/ headCopy.next !=null) {
Node temp = headCopy.next;
headCopy.next = null;
headCopy = temp;
findNode(headCopy);
}
return;
}
public Node flatten(Node head) {
//初步想法:我们可以开一个二维数组来存储所有链表中节点
//每一行都可以作为一个完整的链表
//由于数组不好变长,我们可以使用list,二维的list
//版本二想法:初步想法是错的,因为我没读懂题目;
//采用dfs 深度优先遍历
//边界值判断
if(head == null) return head;
//没有下一个,直接返回其本身就可以
//if(head.next == null) return head;
//dfs遍历
findNode(head);
Node temp = list.get(0);
Node result = temp;
//采用尾插法来构建链表
for(int i = 1; i < list.size(); i++) {
temp.next = null;
temp.next = list.get(i);
list.get(i).prev = null;
list.get(i).prev = temp;
temp = temp.next;
}
return result;
}
}
dfs : 但是只过了22个点,一共26个点,剩下四个点,就是特殊情况,需要再加几个判断,或者想办法把自己的方法变得更健壮一些。但是,dfs本身我写的算法没问题,但是由于我边界条件判断想的片面了,导致出问题。把边界条件去掉即可。