|
1 | 1 | - 问题:
|
2 | | - - 给定一个链表的头节点,要求展平一个双向链表。这意味着将链表中的嵌套结构(比如 **`child`** 指针)转换为一个单一的链表。 |
| 2 | + - 给定一个链表的头节点,要求展平一个双向链表。这意味着将链表中的嵌套结构(比如 **`child`** 指针)转换为一个单一的链表。每个节点都是一个结构体,定义如下所示: |
| 3 | + |
| 4 | + ```cpp |
| 5 | + struct Node{ |
| 6 | + Node* next; |
| 7 | + Node* prev; |
| 8 | + Node* child; |
| 9 | + int value; |
| 10 | + }; |
| 11 | + ``` |
| 12 | + |
3 | 13 | - 例子:
|
4 | 14 | - 原输入:
|
5 | 15 |
|
|
15 | 25 | 1 -> 4 -> 5 -> 2 -> 3
|
16 | 26 | ```
|
17 | 27 |
|
18 | | - - 算法思想:前序遍历 |
| 28 | + - 问题分析: |
| 29 | + 1. 存在嵌套结构: 题目中的 `child` 指针,说明存在链表内部的嵌套结构; |
| 30 | + 2. 整体与局部的关系: 嵌套的子链表结构与整体链表结构相似,可以将展平问题分解为先展平子链表,再将其连接到父链表的过程。 |
| 31 | + 3. 逐步简化问题: 在展平链表的问题中,可以通过逐一处理每个节点及其子链表来简化问题。 |
| 32 | + 1. 处理每一个节点: |
| 33 | + 1. 情况一,为空,则终止 |
| 34 | + 2. 情况二,不为空,则将这个节点加入到结果列表里 |
| 35 | + 1. 检查节点是否有child,如果有,则继续检查子child |
| 36 | + 2. 检查节点是否有next 节点,如果有,则继续检查next child |
| 37 | + 4. 终止条件: 链表为空或没有子链表的节点。 |
| 38 | + - 算法思想:递归+前序遍历 |
19 | 39 |
|
20 | 40 | ```cpp
|
21 | 41 | #include <iostream>
|
|
0 commit comments