链表专题5.奇偶链表

给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。

请尝试使用原地算法完成。你的算法的空间复杂度应为 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;
    }
};
```

发布了35 篇原创文章 · 获赞 27 · 访问量 470

猜你喜欢

转载自blog.csdn.net/weixin_45221477/article/details/104931934