法一:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* oddEvenList(ListNode* head) {
ListNode *evenhead = NULL;
ListNode *oddhead = NULL;
int flag = 0;
ListNode *tmp = head;
ListNode *odd_head_tail = oddhead;
ListNode *even_head_tail = evenhead;
while(tmp != NULL)
{
ListNode *tmp_node = new ListNode(tmp->val);
if(!flag)
{
if(oddhead == NULL)
{
oddhead = tmp_node;
odd_head_tail = tmp_node;
}
else
{
odd_head_tail->next = tmp_node;
odd_head_tail = tmp_node;
}
}
else
{
if(evenhead == NULL)
{
evenhead = tmp_node;
even_head_tail = tmp_node;
}
else
{
even_head_tail->next = tmp_node;
even_head_tail = tmp_node;
}
}
flag = 1 - flag;
tmp = tmp->next;
}
/*
while(oddhead != NULL)
{
cout << oddhead->val << " ";
oddhead = oddhead->next;
}
cout << endl;
while(evenhead != NULL)
{
cout << evenhead->val << " ";
evenhead = evenhead->next;
}
cout << endl;
*/
if(odd_head_tail != NULL)
odd_head_tail->next = evenhead;
/*
while(oddhead != NULL)
{
cout << oddhead->val << " ";
oddhead = oddhead->next;
}
cout << endl;
*/
return oddhead;
}
};
法二:
ListNode* oddEvenList(ListNode* head)
{
if(!head) return head;
ListNode *odd=head, *evenhead=head->next, *even = evenhead;
while(even && even->next)
{
odd->next = odd->next->next;
even->next = even->next->next;
odd = odd->next;
even = even->next;
}
odd->next = evenhead;
return head;
}