Website Summary Files Commits Branches @commit @diff @stats
path: root / Additional / rearange.cpp
diff options
context:
space:
mode:
1 files changed, 55 insertions, 0 deletions
-rw-r--r--Additional/rearange.cpp55
diff --git a/Additional/rearange.cpp b/Additional/rearange.cpp
new file mode 100644
index 0000000..48dacff
--- /dev/null
+++ b/Additional/rearange.cpp
@@ -0,0 +1,55 @@
+#include<iostream>
+#include"../Seminar04/linked-list-utils.h"
+
+using ListNode = LinkedListNode<int>;
+
+ListNode* rearange(ListNode* head) {
+ ListNode* oddStart = nullptr;
+ ListNode* oddIter = nullptr;
+
+ ListNode* evenStart = nullptr;
+ ListNode* evenIter = nullptr;
+
+ while(head != nullptr) {
+ if(head->data % 2 == 1) {
+ if(oddIter == nullptr) {
+ oddStart = head;
+ oddIter = head;
+ }
+ else {
+ oddIter->next = head;
+ oddIter = oddIter->next;
+ }
+ }
+ else {
+ if(evenIter == nullptr) {
+ evenStart = head;
+ evenIter = head;
+ }
+ else {
+ evenIter->next = head;
+ evenIter = evenIter->next;
+ }
+ }
+
+ head = head->next;
+ }
+
+ if(evenStart == nullptr)
+ return oddStart;
+
+ evenIter->next = oddStart;
+
+ if(oddIter != nullptr)
+ oddIter->next = nullptr;
+
+ return evenStart;
+}
+
+int main() {
+ ListNode* ll = new ListNode(3, new ListNode(5, new ListNode(2, new ListNode(9, new ListNode(4)))));
+ ListNode* res = rearange(ll);
+
+ printLinkedList(res);
+ freeList(res);
+} \ No newline at end of file