LeetCode 430 扁平化多级双向链表[递归 栈] HERODING的LeetCode之路

Posted HERODING23

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 430 扁平化多级双向链表[递归 栈] HERODING的LeetCode之路相关的知识,希望对你有一定的参考价值。



### 解题思路1:栈方法
遇到这种有“深度”的题目自然会联想到递归,这里有两个思路,第一个就是用栈的形式存储,首先循环条件是节点不为空,每次遇到有孩子的节点,如果该节点的next不为空就放入栈中,接着把孩子连到next中,当遍历到节点的next为空了,看看栈中有无节点,有就接上去,接着遍历,代码如下:

/*
// Definition for a Node.
class Node {
public:
    int val;
    Node* prev;
    Node* next;
    Node* child;
};
*/

class Solution {
public:
    Node* flatten(Node* head) {
        Node* node = head;
        stack<Node*> s;
        while(node != nullptr) {
            // 孩子不为空
            if(node -> child != nullptr) {
                if(node -> next != nullptr) {
                    s.push(node -> next);
                }
                Node* child = node -> child;
                // 扁平化
                node -> next = child;
                child -> prev = node;
                // 孩子要去掉
                node -> child = nullptr;
            }
            if(node -> next == nullptr && !s.empty()) {
                Node* next = s.top();
                s.pop();
                node -> next = next;
                next -> prev = node;
            }
            node = node -> next;
        }
        return head;
    }
};

解题思路2:递归

递归的方式就更好理解了,循环条件也是节点不为空,如果遇到节点有孩子,就保存next节点并把孩子接上,接着把孩子的子链过滤到头,再把头和保存的next节点连接即可,代码如下:

/*
// Definition for a Node.
class Node {
public:
    int val;
    Node* prev;
    Node* next;
    Node* child;
};
*/

class Solution {
public:
    Node* flatten(Node* head) {
        if(head == nullptr) return nullptr;
        Node* node = head;
        while(node != nullptr) {
            // 孩子不为空
            if(node -> child != nullptr) {
                Node* next = node -> next;
                Node* child = flatten(node -> child);
                // 扁平化
                node -> next = child;
                child -> prev = node;
                // 孩子要去掉
                node -> child = nullptr;
                if(next != nullptr) {
                    // 遍历到当前扁平化的尾部
                    while(node -> next != nullptr) {
                        node = node -> next;
                    }
                    // 和之前的next连接
                    node -> next = next;
                    next -> prev = node;
                }
            }
            node = node -> next;
        }
        return head;
    }
};

以上是关于LeetCode 430 扁平化多级双向链表[递归 栈] HERODING的LeetCode之路的主要内容,如果未能解决你的问题,请参考以下文章

leetcode中等430扁平化多级双向链表

LeetCode - 430 - 扁平化多级双向链表 - Java - 细喔

LeetCode 430. 扁平化多级双向链表 / 583. 两个字符串的删除操作 / 478. 在圆内随机生成点(拒绝采样圆形面积推导)

Leetcode——扁平化多级双向链表

深搜+栈==实现扁平化多级双向链表

数据结构与算法之深入解析“扁平化多级双向链表”的求解思路与算法示例