328. Odd Even Linked List

Description:

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 ...

给定一个单链表,将所有奇数结点组合在一起,偶数节点也同样。请注意,这里我们讨论的是结点号码,而不是结点的值。

注:
奇偶组内部的相对顺序应该与输入中的顺序保持一致。

第一个结点被认为是奇数,第二个结点被认为是偶数......


算法思路:

使用多个指针,一个指针指向奇数个数的结点,一个指向偶数个数的结点,还有一个保存偶数链表的第一个结点。而后分别将奇数偶数个的结点链接成为两条链表,最后将奇链表的最后一个结点的next指向偶链表的第一个结点


struct ListNode* oddEvenList(struct ListNode* head) {
    
    if(head==NULL||head->next==NULL||head->next->next==NULL)
        return head;
    
    
    struct ListNode *odd=head;
    struct ListNode *groups=head->next;
    struct ListNode *groupshead=head->next;   //当作偶数表头,方便奇数偶数链接
    
    while(groups&&groups->next)  //不加groups条件就会有错误 
    {                            //这里的判断条件是偶结点不存在
        odd->next=groups->next;
        odd=groups->next;    //奇指针移动到奇链表的尾端
        
        groups->next=odd->next;
        groups=odd->next;  //偶指针也移到尾部
    }
    odd->next=groupshead;     //将奇偶链表连接
    return head;
}

不要忘记开始时对初始的链表中结点的个数进行判断

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值