#include <iostream>
using
namespace
std;
class
Node {
public
:
int
val;
Node* next;
Node(
int
x) {
val = x;
next = NULL;
}
};
void
printLL(Node* head) {
while
(head != NULL) {
cout << head->val <<
" "
;
head = head->next;
}
cout << endl;
}
Node* swapNodes(Node* head, Node* even, Node* odd) {
Node* prevEven = NULL;
Node* currEven = head;
while
(currEven != NULL && currEven != even) {
prevEven = currEven;
currEven = currEven->next;
}
Node* prevOdd = NULL;
Node* currOdd = head;
while
(currOdd != NULL && currOdd != odd) {
prevOdd = currOdd;
currOdd = currOdd->next;
}
if
(currEven == NULL || currOdd == NULL) {
return
head;
}
if
(prevEven != NULL) {
prevEven->next = currOdd;
}
else
{
head = currOdd;
}
if
(prevOdd != NULL) {
prevOdd->next = currEven;
}
else
{
head = currEven;
}
Node* temp = currEven->next;
currEven->next = currOdd->next;
currOdd->next = temp;
return
head;
}
void
swapOddAndEvenNodes(Node* head) {
Node* even = NULL;
Node* curr = head;
while
(curr != NULL) {
if
(curr->val % 2 == 0) {
even = curr;
}
curr = curr->next;
}
Node* odd = NULL;
curr = head;
while
(curr != NULL) {
if
(curr->val % 2 != 0) {
odd = curr;
break
;
}
curr = curr->next;
}
if
(odd != NULL && even != NULL) {
head = swapNodes(head, even, odd);
}
printLL(head);
}
Node* linkedList(
int
arr[],
int
n) {
Node* head = NULL;
Node* ptr = NULL;
for
(
int
i = 0; i < n; i++) {
if
(head == NULL) {
head =
new
Node(arr[i]);
ptr = head;
}
else
{
Node* newNode =
new
Node(arr[i]);
ptr->next = newNode;
ptr = newNode;
}
}
return
head;
}
int
main() {
int
arr[] = { 4, 3, 5, 2, 3 };
int
n =
sizeof
(arr) /
sizeof
(arr[0]);
Node* head = linkedList(arr, n);
swapOddAndEvenNodes(head);
return
0;
}