题目介绍
力扣430题:leetcode-cn.com/problems/fl…
分析
根据题目的要求,我们要做的就是找到包含子链表的节点,将链表从此断开,接上子链表,接着将子链表的尾节点接上当前节点之前的下一个节点。具体如下图所示:
迭代的处理节点顺序为:
但由于链表本身不存在环,「迭代」的构建顺序发生调整,仍然可以确保每个节点被访问的次数为常数次。
代码如下:
/*
// 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) {
tranverse(head);
return head;
}
public void tranverse(Node head) {
if(head == null) {
return;
}
while(head != null) {
//找到有子链表的节点
if(head.child != null) {
//首先保存当前节点的下一个节点
Node nextNode = head.next;
//当前节点的next指针指向子节点
head.next = head.child;
//子节点的prev指针指向当前节点
head.child.prev = head;
//将当前节点的孩子节点指针置为空
head.child = null;
Node cur = head;
//遍历当前节点下面的所有子节点,找到子节点链表的尾节点
while(cur.next != null) {
cur = cur.next;
}
//子链表的尾节点指向当前节点之前的下一个节点
cur.next = nextNode;
if(nextNode != null) {
nextNode.prev = cur;
}
}
head = head.next;
}
}
}