题目描述:
给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。
请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。
示例 1:
输入: 1->2->3->4->5->NULL
输出: 1->3->5->2->4->NULL
示例 2:
输入: 2->1->3->5->6->4->7->NULL
输出: 2->3->6->7->1->5->4->NULL
说明:
应当保持奇数节点和偶数节点的相对顺序。
链表的第一个节点视为奇数节点,第二个节点视为偶数节点,以此类推。
#include <vector>
#include <stdio.h>
#include <algorithm>
using namespace std;
#include <iostream>
struct ListNode
{
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode *createLinkedList(int nums[], int len_nums)
{
if (len_nums == 0)
{
return NULL;
}
ListNode *head = new ListNode(nums[0]);
ListNode *curNode = head;
int i = 1;
while (i < len_nums)
{
ListNode *nextNode = new ListNode(nums[i]);
curNode->next = nextNode;
curNode = nextNode;
i++;
}
curNode->next = NULL;
return head;
}
void printLinkedList(ListNode *head)
{
ListNode *curNode = head;
while (curNode != NULL)
{
printf("%d -> ", curNode->val);
curNode = curNode->next;
}
printf("NULL\n");
}
class Solution
{
public:
ListNode *oddEvenList(ListNode *head)
{
if (head == NULL)
{
return NULL;
}
int index = 1;
ListNode *curNode = NULL;
ListNode *cur2Node = NULL;
ListNode *preNode = NULL;
ListNode *nextNode = head;
while (nextNode != NULL)
{
if (index % 2 == 0)
{
if (!cur2Node)
{
cur2Node = nextNode;
}
else
{
preNode->next = nextNode;
preNode = nextNode;
}
preNode = nextNode;
nextNode = nextNode->next;
index++;
}
else
{
if (!curNode)
{
curNode = nextNode;
}
else
{
curNode->next = nextNode;
curNode = nextNode;
}
nextNode = nextNode->next;
index++;
}
}
curNode->next = cur2Node;
if (preNode != NULL)
{
preNode->next = NULL;
}
return head;
}
};
int main()
{
int nums[] = {1};
int len_nums = sizeof(nums) / sizeof(int);
ListNode *head = createLinkedList(nums, len_nums);
printLinkedList(head);
ListNode *ans = Solution().oddEvenList(head);
printLinkedList(ans);
return 0;
}