328. Odd Even Linked List 题解

本文详细介绍了328. Odd Even Linked List问题的解决方案。通过对给定的单链表进行重新排序,使得所有奇数节点在前,偶数节点在后,同时保持奇数和偶数内部的相对顺序不变。算法实现主要通过一次遍历,空间复杂度为O(1),时间复杂度为O(n)。文章包含具体算法描述及代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

328. Odd Even Linked List  题解



题目描述:

           

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


题目链接:328. Odd Even Linked List


算法描述:

       由题意知,给定一个元素从1 至 n 的初始链表,要求对初始链表进行重新排序,使得奇数在前,偶数在后,依然需要保证奇数偶数分别递增排列,空间复杂度为 “O (1)”。


       当链表为空或者链表中元素小于 3 时,直接返回链表。


       题目要求空间复杂度为“O (1)” ,因此我们只能在原链表中进行操作。我们从头开始遍历链表,因为链表元素的排列方式为 “奇 - 偶 - 奇 - 偶····” ,因此我们仅需要操作链表长度的二分之一次即可。我们需要设置一个尾指针 “end” 帮助我们当遍历到偶数时将该偶数置于尾部。最后需要注意,结果链表最后一个元素为 “NULL”。



代码:

/**
 * 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) {
        if(head == NULL){
            return head;
        }
        ListNode* p = head;
        int cnt = 1;
        while(p->next != NULL){
            cnt++;
            p = p->next;
        }
        if(cnt < 3){
            return head;
        }
        
        ListNode* end = p;
        ListNode* ct = head;
        for(int i = 0; i < cnt/2; i++){
            ListNode* temp = ct->next;
            ct->next = temp->next;
            end->next = temp;
            temp->next = NULL;
            end = temp;
            ct = ct->next;
        }
        
        return head;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值