Skip to content

Commit bb593bc

Browse files
authored
Create 5.4.6还原展平的链表.md
1 parent eaea291 commit bb593bc

File tree

1 file changed

+86
-0
lines changed

1 file changed

+86
-0
lines changed

5.4.6还原展平的链表.md

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
- 问题:还原5.4.5节被展平后的链表,输出第一层的所有结点。
2+
- 思路:
3+
1. 在展平链表之前,为每个节点添加一个额外的指针,例如 **`originalChild`**,用于存储节点原始的 **`child`** 指针。
4+
2. 在展平链表的过程中,将节点的 **`child`** 指针复制到相应的 **`originalChild`** 指针。
5+
3. 在展平链表之后,即展平链表已经完成,通过遍历每个节点,将 **`originalChild`** 指针用于还原原始的嵌套结构。
6+
7+
```cpp
8+
#include <iostream>
9+
#include <list>
10+
using namespace std;
11+
12+
struct Node{
13+
Node* next;
14+
Node* prev;
15+
Node* child;
16+
Node* originChild;
17+
int value;
18+
};
19+
20+
void FlattenList(Node* node, std::list<Node>& res){
21+
if(node == nullptr){
22+
return;
23+
}
24+
25+
res.push_back(*node);
26+
node->originChild = node->child;
27+
FlattenList(node->child, res);
28+
FlattenList(node->next, res);
29+
}
30+
31+
std::list<Node> FlattenListHelper(Node* head){
32+
std::list<Node> res;
33+
FlattenList(head, res);
34+
return res;
35+
}
36+
37+
void RestoreList(Node* head){
38+
Node* cur = head;
39+
while(cur != nullptr){
40+
cur->child = cur->originChild;
41+
cur = cur->next;
42+
}
43+
}
44+
45+
int main() {
46+
// origin list:
47+
// 1 -> 2 -> 3
48+
// |
49+
// 4 -> 5
50+
51+
Node* head = new Node{ nullptr, nullptr, nullptr, nullptr, 1 };
52+
head->next = new Node{ nullptr, nullptr, nullptr, nullptr, 2 };
53+
head->next->prev = head;
54+
head->next->next = new Node{ nullptr, nullptr, nullptr, nullptr, 3 };
55+
head->next->next->prev = head->next;
56+
head->child = new Node{ nullptr, nullptr, nullptr, nullptr, 4 };
57+
head->child->next = new Node{ nullptr, nullptr, nullptr, nullptr, 5 };
58+
head->child->next->prev = head->child;
59+
60+
std::list<Node> flattenedList = FlattenListHelper(head);
61+
62+
for (const Node& node : flattenedList) {
63+
cout << node.value << " ";// 1 -> 4 -> 5 -> 2 -> 3
64+
}
65+
cout << endl;
66+
67+
RestoreList(head);
68+
69+
auto it = head;
70+
while(it != nullptr){
71+
cout << it->value << " ";
72+
it = it->next;
73+
}
74+
cout << endl;
75+
76+
// Clean up memory
77+
Node* current = head;
78+
while (current != nullptr) {
79+
Node* temp = current;
80+
current = current->next;
81+
delete temp;
82+
}
83+
84+
return 0;
85+
}
86+
```

0 commit comments

Comments
 (0)