#include <iostream>
struct node {
int x;
node *next;
};
int countLinkedList(node *n, node **last = NULL) {
int count = 0;
if (last) *last = NULL;
while (n) {
++count;
if (last) *last = n;
n = n->next;
}
return count;
}
node* makeLinkedListNode(int x) {
node *n = new node; // (node*) malloc(sizeof(node));
n->x = x;
n->next = NULL;
return n;
}
void freeLinkedList(node *n) {
node *next;
while (n) {
next = n->next;
delete n; // free(n);
n = next;
}
}
void copyLinkedList(node *n) {
node *last;
for (int y = countLinkedList(n, &last); y > 0; --y) {
last->next = makeLinkedListNode(n->x);
last = last->next;
n = n->next;
}
}
void printLinkedList(node *n) {
while (n) {
std::cout << n->x << " ";
n = n->next;
}
std::cout << std::endl;
}
int main() {
node *root = makeLinkedListNode(10);
root->next = makeLinkedListNode(20);
root->next->next = makeLinkedListNode(30);
std::cout << "Before copy: ";
printLinkedList(root);
copyLinkedList(root);
std::cout << "After copy: ";
printLinkedList(root);
freeLinkedList(root);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IG5vZGUgewogICAgaW50IHg7CiAgICBub2RlICpuZXh0Owp9OwoKaW50IGNvdW50TGlua2VkTGlzdChub2RlICpuLCBub2RlICoqbGFzdCA9IE5VTEwpIHsKICAgIGludCBjb3VudCA9IDA7CiAgICBpZiAobGFzdCkgKmxhc3QgPSBOVUxMOwogICAgd2hpbGUgKG4pIHsKICAgICAgICArK2NvdW50OwogICAgICAgIGlmIChsYXN0KSAqbGFzdCA9IG47CiAgICAgICAgbiA9IG4tPm5leHQ7CiAgICB9CiAgICByZXR1cm4gY291bnQ7Cn0KCm5vZGUqIG1ha2VMaW5rZWRMaXN0Tm9kZShpbnQgeCkgewogICAgbm9kZSAqbiA9IG5ldyBub2RlOyAvLyAobm9kZSopIG1hbGxvYyhzaXplb2Yobm9kZSkpOwogICAgbi0+eCA9IHg7CiAgICBuLT5uZXh0ID0gTlVMTDsKICAgIHJldHVybiBuOwp9Cgp2b2lkIGZyZWVMaW5rZWRMaXN0KG5vZGUgKm4pIHsKICAgIG5vZGUgKm5leHQ7CiAgICB3aGlsZSAobikgewogICAgICAgIG5leHQgPSBuLT5uZXh0OwogICAgICAgIGRlbGV0ZSBuOyAvLyBmcmVlKG4pOwogICAgICAgIG4gPSBuZXh0OwogICAgfQp9Cgp2b2lkIGNvcHlMaW5rZWRMaXN0KG5vZGUgKm4pIHsKICAgIG5vZGUgKmxhc3Q7CiAgICBmb3IgKGludCB5ID0gY291bnRMaW5rZWRMaXN0KG4sICZsYXN0KTsgeSA+IDA7IC0teSkgewogICAgICAgIGxhc3QtPm5leHQgPSBtYWtlTGlua2VkTGlzdE5vZGUobi0+eCk7CiAgICAgICAgbGFzdCA9IGxhc3QtPm5leHQ7CiAgICAgICAgbiA9IG4tPm5leHQ7CiAgICB9Cn0KCnZvaWQgcHJpbnRMaW5rZWRMaXN0KG5vZGUgKm4pIHsKICAgIHdoaWxlIChuKSB7CiAgICAgICAgc3RkOjpjb3V0IDw8IG4tPnggPDwgIiAiOwogICAgICAgIG4gPSBuLT5uZXh0OwogICAgfQogICAgc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKfQoKaW50IG1haW4oKSB7CiAgICBub2RlICpyb290ID0gbWFrZUxpbmtlZExpc3ROb2RlKDEwKTsKICAgIHJvb3QtPm5leHQgPSBtYWtlTGlua2VkTGlzdE5vZGUoMjApOwogICAgcm9vdC0+bmV4dC0+bmV4dCA9IG1ha2VMaW5rZWRMaXN0Tm9kZSgzMCk7CiAgICAKICAgIHN0ZDo6Y291dCA8PCAiQmVmb3JlIGNvcHk6ICI7CiAgICBwcmludExpbmtlZExpc3Qocm9vdCk7CgogICAgY29weUxpbmtlZExpc3Qocm9vdCk7CgogICAgc3RkOjpjb3V0IDw8ICJBZnRlciBjb3B5OiAiOwogICAgcHJpbnRMaW5rZWRMaXN0KHJvb3QpOwogICAgCiAgICBmcmVlTGlua2VkTGlzdChyb290KTsKICAgIHJldHVybiAwOwp9