C++实现LeetCode 430 扁平化多级双向链表
题目描述:
多级双向链表中,除了指向下一个节点和前一个节点指针之外,它还有一个子链表指针,可能指向单独的双向链表。这些子列表也可能会有一个或多个自己的子项,依此类推,生成多级数据结构,如下面的示例所示。
给你位于列表第一级的头节点,请你扁平化列表,使所有结点出现在单级双链表中。
示例:
输入: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]
输入的多级列表如下图所示:
扁平化后的链表如下图:
主要思路:
对于这道题首先想到的思路首先用一个指针pi_move遍历链表,当遇到某个结点存在子链表,用child_head和child_tail指向子链表的首部,然后再将child_tail指针移动到子链表的尾部。当知道子链表的首尾位置之后就可以将子链表插入上一级链表了。之后pi_move再往后遍历重复上面寻找子链表的操作,直到链表的尾部。
第一次提交实现代码(这个代码有个小问题,对于某个测试用例会出现错误):
class Solution {
public:
Node* flatten(Node* head) {
Node *pi_head = head;
Node *pi_move = head; //遍历链表的指针
if(pi_head == nullptr){
return pi_head;
}
while(pi_move != nullptr){
if(pi_move->child != nullptr){
//这两个指针分别是指向子链表的首位的指针
Node *c_h = pi_move->child, *c_end = pi_move->child;
while(c_end->next != nullptr){ //尾指针移动至子链表的尾部
c_end = c_end->next;
}
//将子链表接入父链表中
pi_move->child = nullptr;
//这里之后需要修改
c_end->next = pi_move->next;
pi_move->next->prev = c_end;
pi_move->next = c_h;
c_h->prev = pi_move;
}
pi_move = pi_move->next;
}
return pi_head;
}
};
第一次提交出现的问题:
第一次提交并没有成功,在某个测试用例上出现错误,如下:
测试用例:
[4201,null,1937,null,3203,null,4328,null,4557,null,4928,null,1943,null,
...........
3428,null,1996,null,2582,null,2534,null,3498,null,60,null,1355,null,1655]
错误信息:
Line 28: Char 32: runtime error: member access within null pointer of type 'Node' (solution.cpp)
这个用例很长,其结构类似于:
1,null,2,null,3
而出错提示所在的语句是第一次提交代码中的:
pi_move->next->prev = c_end;
错误的原因应该是pi_move对空指针进行操作从而出现错误,而修改的方式就是在该语句之前添加一个if限定,如下:
if(pi_move->next != nullptr)
最后的结果是全部测试用例通过。