Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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)

AltStyle によって変換されたページ (->オリジナル) /