总的思路为碰到拥有子项的节点入栈,向下遍历子链表,将子链表结尾与栈顶下一节点连接,然后返回向后遍历上层链表,同时注意断开多余的连接。碰到特殊情况如[1,null,2,null,3,null]时,需要采用另一种方法,即实时连接当前节点与子链表当前节点,如果按照之前的思路遍历到最深处返回连接会出错!
第一次完全不看题解做出来,且完全可以接受,嘿嘿嘿。(一会再去看看题解优化一下代码~)
打卡打卡!
// Definition for a Node.
class Node {
public:
int val;
Node* prev;
Node* next;
Node* child;
};
*/
class Solution
{
public:
Node *flatten(Node *head) //总的思路为碰到拥有子项的节点入栈,向下遍历子链表,将子链表结尾与栈顶下一节点连接,同时注意断开多余的连接
{
stack<Node *> MyStack;
Node *p = head;
if (p == nullptr)
return head;
while (!(MyStack.empty() && p->next == nullptr && p->child == nullptr)) //判别条件加入p->child == nullptr就是因为要考虑特殊情况
{
if (p->child != nullptr)
{
if (p->next != nullptr) //当前节点入栈,转向后为向下遍历
{
MyStack.push(p);
p = p->child;
continue;
}
else //考虑到[1,null,2,null,3,null]的特殊情况,不入栈,直接操作当前节点与子链表节点
{
p->next = p->child;
p->child->prev = p;
p->child = nullptr;
p = p->next;
continue;
}
}
if (p->next == nullptr) //说明当前是子链表的尾部,将当前尾节点与栈顶节点连接,注意断开不需要的连接
{
Node *temp = MyStack.top();
p->next = temp->next;
temp->next->prev = p;
p = temp->next;
temp->next = temp->child;
temp->child->prev = temp;
temp->child = nullptr;
MyStack.pop(); //记得删除栈顶!
continue;
}
p = p->next; //碰到常规节点直接像后遍历
}
return head;
}
};