给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。
请尝试使用原地算法完成。你的算法的空间复杂度应为 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
说明:
应当保持奇数节点和偶数节点的相对顺序。
链表的第一个节点视为奇数节点,第二个节点视为偶数节点,以此类推。
***解题思路:利用尾插法建立两个新链表一个双数,一个单数,然后将单数结尾指向双数开头即可
代码如下:***
```cpp
class Solution {
public:
ListNode* oddEvenList(ListNode* head) {
if(head==NULL ||head->next==NULL ||head->next->next==NULL)
{
return head;
}
int location=0;
ListNode* siglelist = new ListNode(NULL);//单数链表
ListNode* doublelist = new ListNode(NULL);//双数链表
ListNode* q=siglelist;
ListNode* p=doublelist;
while(head){
location++;//用来记录是第几个节点
if(location%2!=0){
q->next=head;//使单数标next指向此时的head
q=head;//q指针移动到head
}
else if(location%2==0){
p->next=head;//使双数标next指向此时的head
p=head;//p指针移动到head
}
head=head->next;
}
p->next=NULL;//将双数指针尾置为NULL
q->next=doublelist->next;使单数表结尾指向双数表开头
return siglelist->next;
}
};
```