Cho một danh sách liên kết L chứa các giá trị nguyên, nhiệm vụ cần thực hiện là loại bỏ các nút có giá trị tuyệt đối lặp lại. Với mỗi giá trị K, chỉ nút đầu tiên có giá trị tuyệt đối bằng K được giữ lại. Các nút bị loại bỏ sẽ được lưu vào một danh sách liên kết riêng. Ví dụ: với L = 21→-15→-15→-7→15, kết quả cần trả về là danh sách đã xử lý 21→-15→-7 và danh sách chứa các phần tử bị loại -15→15.
Định dạng đầu vào:
- Dòng đầu tiên chứa địa chỉ đầu danh sách và số lượng nút
N(≤ 105). - Mỗi dòng tiếp theo mô tả một nút theo định dạng:
địa chỉ giá_trị địa_chỉ_kế_tiếp. - Địa chỉ trống được biểu diễn bằng
-1.
Định dạng đầu ra:
- Đầu tiên in danh sách đã xử lý, sau đó in danh sách chứa các nút bị loại.
- Mỗi nút được in theo định dạng
địa_chỉ giá_trị địa_chỉ_kế_tiếp.
Ví dụ đầu vào:
00100 5 99999 -7 87654 23854 -15 00000 87654 15 -1 00000 -15 99999 00100 21 23854
Ví dụ đầu ra:
00100 21 23854 23854 -15 99999 99999 -7 -1 00000 -15 87654 87654 15 -1
Phương pháp giải quyết:
- Tổ chức lưu trữ dữ liệu bằng cấu trúc mảng kết hợp với bản đồ đánh dấu giá trị đã xuất hiện.
- Duyệt qua danh sách liên kết từ đầu, kiểm tra giá trị tuyệt đối của mỗi nút.
- Nếu giá trị chưa xuất hiện, in ra và đánh dấu; nếu đã xuất hiện, thêm vào danh sách phụ.
- Xử lý đặc biệt cho trường hợp danh sách phụ trống.
Mã nguồn tham khảo (đã tối ưu hóa):
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
const int MAX_ADDR = 100010;
int value[MAX_ADDR];
int next_addr[MAX_ADDR];
bool seen_value[10001];
int main() {
int head, total_nodes;
cin >> head >> total_nodes;
for (int i = 0; i < total_nodes; i++) {
int addr, val, next;
cin >> addr >> val >> next;
value[addr] = val;
next_addr[addr] = next;
}
vector<int> duplicate_nodes;
int current = head;
while (current != -1) {
int abs_val = abs(value[current]);
if (!seen_value[abs_val]) {
seen_value[abs_val] = true;
printf("%05d %d ", current, value[current]);
current = next_addr[current];
if (current != -1) printf("%05d\n", current);
} else {
duplicate_nodes.push_back(current);
current = next_addr[current];
}
}
if (!duplicate_nodes.empty()) {
printf("%05d %d ", duplicate_nodes[0], value[duplicate_nodes[0]]);
for (int i = 1; i < duplicate_nodes.size(); i++) {
printf("%05d\n", duplicate_nodes[i]);
printf("%05d %d ", duplicate_nodes[i], value[duplicate_nodes[i]]);
}
printf("-1");
}
return 0;
}