#include <iostream>
using namespace std;
struct ListNode
{
int val;
ListNode *next;
ListNode() : val(0), next(nullptr) {}
ListNode(int x) : val(x), next(nullptr) {}
ListNode(int x, ListNode *next) : val(x), next(next) {}
};
ListNode* cloneList(ListNode* head) {
if (!head) return NULL; // <-- add this
ListNode *prev = new ListNode(head->val);
head = head->next;
while (head != NULL)
{
ListNode *p = new ListNode(head->val, prev);
head = head->next;
prev = p;
}
return prev;
}
void printList(ListNode* head) {
while (head)
{
cout << head->val << " ";
head = head->next;
}
cout << "\n";
}
void freeList(ListNode* head) {
while (head)
{
ListNode *n = head->next;
delete head;
head = n;
}
}
int main() {
ListNode *head = nullptr;
ListNode **ptr = &head;
for(int i = 1; i <= 5; ++i)
{
*ptr = new ListNode(i);
ptr = &((*ptr)->next);
}
printList(head);
ListNode *clone = cloneList(head);
printList(clone);
freeList(head);
freeList(clone);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IExpc3ROb2RlCnsKICAgIGludCB2YWw7CiAgICBMaXN0Tm9kZSAqbmV4dDsKICAgIExpc3ROb2RlKCkgOiB2YWwoMCksIG5leHQobnVsbHB0cikge30KICAgIExpc3ROb2RlKGludCB4KSA6IHZhbCh4KSwgbmV4dChudWxscHRyKSB7fQogICAgTGlzdE5vZGUoaW50IHgsIExpc3ROb2RlICpuZXh0KSA6IHZhbCh4KSwgbmV4dChuZXh0KSB7fQp9OwoKTGlzdE5vZGUqIGNsb25lTGlzdChMaXN0Tm9kZSogaGVhZCkgewogICAgaWYgKCFoZWFkKSByZXR1cm4gTlVMTDsgLy8gPC0tIGFkZCB0aGlzCiAgICBMaXN0Tm9kZSAqcHJldiA9IG5ldyBMaXN0Tm9kZShoZWFkLT52YWwpOwogICAgaGVhZCA9IGhlYWQtPm5leHQ7CiAgICB3aGlsZSAoaGVhZCAhPSBOVUxMKQogICAgewogICAgICAgIExpc3ROb2RlICpwID0gbmV3IExpc3ROb2RlKGhlYWQtPnZhbCwgcHJldik7CiAgICAgICAgaGVhZCA9IGhlYWQtPm5leHQ7CiAgICAgICAgcHJldiA9IHA7CiAgICB9CiAgICByZXR1cm4gcHJldjsKfQoKdm9pZCBwcmludExpc3QoTGlzdE5vZGUqIGhlYWQpIHsKCXdoaWxlIChoZWFkKQoJewoJCWNvdXQgPDwgaGVhZC0+dmFsIDw8ICIgIjsKCQloZWFkID0gaGVhZC0+bmV4dDsKCX0KCWNvdXQgPDwgIlxuIjsKfQoKdm9pZCBmcmVlTGlzdChMaXN0Tm9kZSogaGVhZCkgewoJd2hpbGUgKGhlYWQpCgl7CgkJTGlzdE5vZGUgKm4gPSBoZWFkLT5uZXh0OwoJCWRlbGV0ZSBoZWFkOwoJCWhlYWQgPSBuOwoJfQp9CgppbnQgbWFpbigpIHsKCglMaXN0Tm9kZSAqaGVhZCA9IG51bGxwdHI7CglMaXN0Tm9kZSAqKnB0ciA9ICZoZWFkOwoJZm9yKGludCBpID0gMTsgaSA8PSA1OyArK2kpCgl7CgkJKnB0ciA9IG5ldyBMaXN0Tm9kZShpKTsKCQlwdHIgPSAmKCgqcHRyKS0+bmV4dCk7Cgl9CgoJcHJpbnRMaXN0KGhlYWQpOwoKCUxpc3ROb2RlICpjbG9uZSA9IGNsb25lTGlzdChoZWFkKTsKCglwcmludExpc3QoY2xvbmUpOwoKCWZyZWVMaXN0KGhlYWQpOwoJZnJlZUxpc3QoY2xvbmUpOwoJcmV0dXJuIDA7Cn0=