LeetCode 430扁平化多级双向链表 C/C++

主要思路

主要分为三步:首先是把孩子结点与父结点连接成双向链表,(记得把当前结点的下一个结点记下);第二步是遍历孩子链表,找到孩子链表的尾结点;最后就是把孩子链表的尾结点与当前结点的下一个结点连起来。

文字不好理解的话 就以题目的样例为例:
输入: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]
1->2->3 此时3的下一个结点是4,但是3有孩子 ,就把7插入到3的后面,接着遍历孩子7这个链表7->8->9->10 ,最后将孩子链表的尾结点与刚才3的下一个结点连起来,即10与4链成双向链表,这时链表的状态是1->2->3->7->8->9->10->4… 接着cur = cur->next,即当前结点变为了7,同样的道理在遍历7,结果变为7->8->11->12->9->10, 最后结果就是1->2->3->7->8->11->12->9->10->4->5->6.
代码就是这样模拟的 最后注意每处理完一个孩子时,该结点的孩子指针赋值为空

/*
class Node{
public:
	int val;
	Node *prev;
	Node *next;
	Node *child;
};
*/

class Solution{
public:
	Node *flatten(Node *head) {
		if(!head)return nullptr;//如果头指针为空直接返回
		Node *cur = head;
		while(cur) {//从第一个元素开始遍历
			Node *cur_nxt = cur->next;//记录当前结点的下一个结点
			if(cur->child) {//如果当前结点有孩子
				//将当前结点与孩子结点连接成双链表形式,并将cur->child赋值为空
				cur->next = cur->child;
				cur->child->prev = cur;
				cur->child = nullptr;

				//遍历孩子链表
				Node *tail = cur->next;
				while(tail&&tail->next) {//找该孩子结点的尾结点,也就是每一级(每一层)的最后一个元素
					tail = tail->next;
				}

				//把这段孩子链表连接到[cur->next,cur_next]区间
				tail->next = cur_nxt;
				if(cur_nxt) {
					cur_nxt->prev = tail;
				}

			}
			cur = cur->next;
		}
		return head;

	}
};



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值