diff --git a/cpp/328_Odd_Even_Linked_List.cpp b/cpp/328_Odd_Even_Linked_List.cpp new file mode 100644 index 0000000..a3ddfb5 --- /dev/null +++ b/cpp/328_Odd_Even_Linked_List.cpp @@ -0,0 +1,66 @@ +// 328. Odd Even Linked List +/** + * Given a singly linked list, group all odd nodes together followed by the even nodes. Please note here we are talking about + * the node number and not the value in the nodes. + * + * You should try to do it in place. The program should run in O(1) space complexity and O(nodes) time complexity. + * + * Example: + * Given 1->2->3->4->5->NULL, + * return 1->3->5->2->4->NULL. + * + * Note: + * The relative order inside both the even and odd groups should remain as it was in the input. + * The first node is considered odd, the second node even and so on ... + * + * Tags: Linked List + * + * Author: Kuang Qin + */ + +#include + +using namespace std; + +/** + * Definition for singly-linked list. + */ +struct ListNode { + int val; + ListNode *next; + ListNode(int x) : val(x), next(NULL) {} + ListNode(int x, ListNode *p) : val(x), next(p) {} +}; + +class Solution { +public: + ListNode* oddEvenList(ListNode* head) { + if (head == NULL || head->next == NULL) { + return head; + } + + ListNode *odd = head, *even = head->next, *evenHead = even; + while (even != NULL && even->next != NULL) { + odd->next = odd->next->next; + even->next = even->next->next; + odd = odd->next; + even = even->next; + } + + odd->next = evenHead; + return head; + } +}; + +int main() { + ListNode node5(5), node4(4, &node5), node3(3, &node4), node2(2, &node3), node1(1, &node2); + Solution sol; + ListNode *newhead = sol.oddEvenList(&node1); + for (ListNode *p = newhead; p != NULL; p = p->next) { + cout << p->val << " "; + } + cout << endl; + cin.get(); + + return 0; +} \ No newline at end of file