#include <iostream>
using namespace std;
struct node
{
int value = 0;
node *next = nullptr;
};
node* get_node_at(node *head, int index, node **previous = nullptr)
{
if (previous) *previous = nullptr;
if ((!head) || (index < 0)) return nullptr;
node *temp = head;
while (index > 0)
{
if (!temp) return nullptr;
if (previous) *previous = temp;
temp = temp->next;
--index;
}
return temp;
}
void swap_nodes(node *&head, int i, int j)
{
if ((!head) || (i == j)) return;
node *previous_i, *previous_j;
node* temp_i = get_node_at(head, i, &previous_i);
node* temp_j = get_node_at(head, j, &previous_j);
if (!temp_i || !temp_j)
return;
if (previous_i)
previous_i->next = temp_j;
if (previous_j)
previous_j->next = temp_i;
node *temp = temp_i->next;
temp_i->next = temp_j->next;
temp_j->next = temp;
if (temp_i == head)
head = temp_j;
else if (temp_j == head)
head = temp_i;
}
int main()
{
node *head = nullptr;
node **ptr = &head;
for (int i = 1; i <= 5; ++i)
{
*ptr = new node;
(*ptr)->value = i;
ptr = &((*ptr)->next);
}
cout << "Before: ";
for(node *temp = head; temp != nullptr; temp = temp->next)
cout << temp->value << " ";
cout << endl;
swap_nodes(head, 0, 4);
swap_nodes(head, 1, 3);
cout << "After: ";
for(node *temp = head; temp != nullptr; temp = temp->next)
cout << temp->value << " ";
cout << endl;
for(node *temp = head; temp != nullptr;)
{
node *n = temp;
temp = temp->next;
delete n;
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IG5vZGUKewogICAgaW50IHZhbHVlID0gMDsKICAgIG5vZGUgKm5leHQgPSBudWxscHRyOwp9OwoKbm9kZSogZ2V0X25vZGVfYXQobm9kZSAqaGVhZCwgaW50IGluZGV4LCBub2RlICoqcHJldmlvdXMgPSBudWxscHRyKQp7CiAgICBpZiAocHJldmlvdXMpICpwcmV2aW91cyA9IG51bGxwdHI7CgogICAgaWYgKCghaGVhZCkgfHwgKGluZGV4IDwgMCkpIHJldHVybiBudWxscHRyOwoKICAgIG5vZGUgKnRlbXAgPSBoZWFkOwogICAgd2hpbGUgKGluZGV4ID4gMCkKICAgIHsKICAgICAgICBpZiAoIXRlbXApIHJldHVybiBudWxscHRyOwogICAgICAgIGlmIChwcmV2aW91cykgKnByZXZpb3VzID0gdGVtcDsKICAgICAgICB0ZW1wID0gdGVtcC0+bmV4dDsKICAgICAgICAtLWluZGV4OwogICAgfQoKICAgIHJldHVybiB0ZW1wOwp9Cgp2b2lkIHN3YXBfbm9kZXMobm9kZSAqJmhlYWQsIGludCBpLCBpbnQgaikKewogICAgaWYgKCghaGVhZCkgfHwgKGkgPT0gaikpIHJldHVybjsKCiAgICBub2RlICpwcmV2aW91c19pLCAqcHJldmlvdXNfajsKICAgIG5vZGUqIHRlbXBfaSA9IGdldF9ub2RlX2F0KGhlYWQsIGksICZwcmV2aW91c19pKTsKICAgIG5vZGUqIHRlbXBfaiA9IGdldF9ub2RlX2F0KGhlYWQsIGosICZwcmV2aW91c19qKTsKCiAgICBpZiAoIXRlbXBfaSB8fCAhdGVtcF9qKQogICAgICAgIHJldHVybjsKCiAgICBpZiAocHJldmlvdXNfaSkKICAgICAgICBwcmV2aW91c19pLT5uZXh0ID0gdGVtcF9qOwoKICAgIGlmIChwcmV2aW91c19qKQogICAgICAgIHByZXZpb3VzX2otPm5leHQgPSB0ZW1wX2k7CgogICAgbm9kZSAqdGVtcCA9IHRlbXBfaS0+bmV4dDsKICAgIHRlbXBfaS0+bmV4dCA9IHRlbXBfai0+bmV4dDsKICAgIHRlbXBfai0+bmV4dCA9IHRlbXA7CgogICBpZiAodGVtcF9pID09IGhlYWQpCiAgICAgICBoZWFkID0gdGVtcF9qOwogICBlbHNlIGlmICh0ZW1wX2ogPT0gaGVhZCkKICAgICAgIGhlYWQgPSB0ZW1wX2k7Cn0KCmludCBtYWluKCkKewogICAgbm9kZSAqaGVhZCA9IG51bGxwdHI7CiAgICBub2RlICoqcHRyID0gJmhlYWQ7CgogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gNTsgKytpKQogICAgewogICAgICAgICpwdHIgPSBuZXcgbm9kZTsKICAgICAgICAoKnB0ciktPnZhbHVlID0gaTsKICAgICAgICBwdHIgPSAmKCgqcHRyKS0+bmV4dCk7CiAgICB9CgogICAgY291dCA8PCAiQmVmb3JlOiAiOwogICAgZm9yKG5vZGUgKnRlbXAgPSBoZWFkOyB0ZW1wICE9IG51bGxwdHI7IHRlbXAgPSB0ZW1wLT5uZXh0KQogICAgICAgIGNvdXQgPDwgdGVtcC0+dmFsdWUgPDwgIiAiOwogICAgY291dCA8PCBlbmRsOwoKICAgIHN3YXBfbm9kZXMoaGVhZCwgMCwgNCk7CiAgICBzd2FwX25vZGVzKGhlYWQsIDEsIDMpOwoKICAgIGNvdXQgPDwgIkFmdGVyOiAiOwogICAgZm9yKG5vZGUgKnRlbXAgPSBoZWFkOyB0ZW1wICE9IG51bGxwdHI7IHRlbXAgPSB0ZW1wLT5uZXh0KQogICAgICAgIGNvdXQgPDwgdGVtcC0+dmFsdWUgPDwgIiAiOwogICAgY291dCA8PCBlbmRsOwoKICAgIGZvcihub2RlICp0ZW1wID0gaGVhZDsgdGVtcCAhPSBudWxscHRyOykKICAgIHsKICAgICAgICBub2RlICpuID0gdGVtcDsKICAgICAgICB0ZW1wID0gdGVtcC0+bmV4dDsKICAgICAgICBkZWxldGUgbjsKICAgIH0KCiAgICByZXR1cm4gMDsKfQ==