[链表]链表的奇偶重排

106 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

问题

给定一个单链表,请设定一个函数,将链表的奇数位节点和偶数位节点分别放在一起,重排后输出。 注意是节点的编号而非节点的数值。

思路

分别创建一条奇数位节点的链表和一条偶数位节点的链表,最后将两条链表拼接。

代码实现

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head ListNode类 
     * @return ListNode类
     */
    ListNode* oddEvenList(ListNode* head) {
        // write code here
        if (head == NULL || head->next == NULL 
                         || head->next->next == NULL)
        {
            return head;
        }
        ListNode* dummyHead = new ListNode(0);
        dummyHead->next = head;
        
        ListNode* oddDummyHead = new ListNode(0);
        ListNode* evenDummyHead = new ListNode(0);
        
        ListNode* oddHead = head;
        ListNode* evenHead = head->next;
        ListNode* cur = head;
        int count = 1;
        while (cur)
        {
            if (count % 2)
            {
                oddDummyHead->next = cur;
                oddDummyHead = oddDummyHead->next;
            }
            else
            {
                evenDummyHead->next = cur;
                evenDummyHead = evenDummyHead->next;
            }
            cur = cur->next;
            count++;
        }
        evenDummyHead->next = NULL;
        oddDummyHead->next = evenHead;
        return oddHead;
    }
};