C++程序 将多级链表展开
给定一个链表,每个节点除了指向下一个节点的指针外,还有一个child指针,它可能指向一个单独的链表。这些子列表可能有一个或多个自己的子节点,以此类推,产生一个多级数据结构,如下图所示。你被给出了列表第一层的头。将列表展开,以便所有节点都出现在单层链接列表中。您需要按以下方式展开列表:一级中的所有节点应首先出现,然后是第二级的节点,依此类推。
上面的列表应转换为10->5->12->7->11->4->20->13->17->6->2->16->9->8->3->19->15
问题清楚地说明我们需要逐层展开。解决方案的想法是,我们从第一级开始,逐个处理所有节点,如果一个节点有一个子节点,那么我们将子节点附加在列表的末尾,否则,我们不做任何事情。处理完第一层后,所有下一级节点将附加在第一层之后。添加节点的过程也是同样的方式。
1) 取 “cur” 指针,它将指向列表的第一级的头
2) 取 “tail” 指针,它将指向第一层的末尾
3) 当 “curr” 不为 NULL 时,重复以下过程。
I) 如果当前节点有子节点,则
a) 将这个新的子列表附加到 “tail” 后面
tail->next = cur->child
b) 找到新子列表的最后一个节点并更新 “tail”
tmp = cur->child;
while (tmp->next != NULL)
tmp = tmp->next;
tail = tmp;
II) 移动到下一个节点,即 cur = cur->next
以下是上述算法的实现。
输出:
时间复杂度: 由于每个节点最多被访问两次,因此时间复杂度为O(n),其中n是给定链表中节点的数量。