forked from keshavsingh4522/hacktoberfest
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSwapNodes.cpp
99 lines (91 loc) · 1.99 KB
/
SwapNodes.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
/*Given a linked list, swap every two adjacent nodes and return its head.
You must solve the problem without modifying the values in the list's nodes (i.e., only nodes themselves may be changed.)*/
#include <bits/stdc++.h>
using namespace std;
struct Node
{
int data;
struct Node *next;
Node(int x)
{
data = x;
next = NULL;
}
};
class Solution
{
public:
Node *AdjacentSwap(struct Node *head)
{
if (head == NULL || head->next == NULL)
return head;
Node *prev = head;
Node *curr = head->next;
head = curr;
while (true)
{
Node *Next = curr->next;
curr->next = prev;
if (Next == NULL || Next->next == NULL)
{
prev->next = Next;
break;
}
prev->next = Next->next;
prev = Next;
curr = prev->next;
}
return head;
}
};
void printList(Node *node)
{
while (node != NULL)
{
cout << node->data << " ";
node = node->next;
}
cout << "\n";
}
int main()
{
int t;
cin >> t;
while (t--)
{
int n;
cin >> n;
int data;
cin >> data;
struct Node *head = new Node(data);
struct Node *tail = head;
map<Node *, int> mp;
mp[head] = head->data;
for (int i = 0; i < n - 1; ++i)
{
cin >> data;
tail->next = new Node(data);
tail = tail->next;
mp[tail] = tail->data;
}
struct Node *failure = new Node(-1);
Solution ob;
head = ob.AdjacentSwap(head);
int flag = 0;
struct Node *temp = head;
while (temp)
{
if (mp[temp] != temp->data)
{
flag = 1;
break;
}
temp = temp->next;
}
if (flag)
printList(failure);
else
printList(head);
}
return 0;
}