力扣练习——6 奇偶链表

1.问题描述

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

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

说明:

 

应当保持奇数节点和偶数节点的相对顺序。

链表的第一个节点视为奇数节点,第二个节点视为偶数节点,以此类推。

 

可使用以下代码,完成其中的oddEvenList函数,其中形参head指向无头结点单链表,返回结果链表的头指针。

#include<iostream>

#include<vector>

using namespace std;

 

struct ListNode

{

    int val;

    ListNode *next;

    ListNode() : val(0), next(NULL) {}

    ListNode(int x) : val(x), next(NULL) {}

    ListNode(int x, ListNode *next) : val(x), next(next) {}

};

class Solution {

public:

    ListNode* oddEvenList(ListNode* head) {

             //填充本函数完成功能  

    }

};

ListNode *createByTail()

{

    ListNode *head;

    ListNode *p1,*p2;

    int n=0,num;

    int len;

    cin>>len;

    head=NULL;

    while(n<len && cin>>num)

    {

        p1=new ListNode(num);

        n=n+1;

        if(n==1)

            head=p1;

        else

            p2->next=p1;

        p2=p1;

    }

    return head;

}

void  displayLink(ListNode *head)

{

    ListNode *p;

    p=head;

    cout<<"head-->";

    while(p!= NULL)

    {

        cout<<p->val<<"-->";

        p=p->next;

    }

    cout<<"tail\n";

}

int main()

{

    ListNode* head = createByTail();

    head=Solution().oddEvenList(head);

    displayLink(head);

    return 0;

}

2.输入说明

首先输入链表长度len,然后输入len个整数,以空格分隔。

3.输出说明

输出格式见范例

4.范例

输入

5
1 2 3 4 5

输出

head-->1-->3-->5-->2-->4-->tail

5.代码

//使用原地算法完成,空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。
//原地算法(in-place algorithm)是一种使用小的,固定数量的额外之空间来转换资料的算法。
#include<iostream>
#include<vector>

using namespace std;



struct ListNode

{

    int val;

    ListNode *next;

    ListNode() : val(0), next(NULL) {}

    ListNode(int x) : val(x), next(NULL) {}

    ListNode(int x, ListNode *next) : val(x), next(next) {}

};

class Solution {

public:

    ListNode* oddEvenList(ListNode* head) {

        //填充本函数完成功能  
        //思想:分别用奇数链表和偶数链表存储,然后拼接即可
        if (head == NULL)
            return NULL;
        ListNode *oddList=(ListNode*)malloc(sizeof(ListNode));//偶数链表头节点
        ListNode *evenList=(ListNode*)malloc(sizeof(ListNode));//奇数链表头节点
        ListNode *p, *q;
        p = oddList;//偶数链表
        q = evenList;//奇数链表
        int cnt = 1;
        while (head)
        {
            if (cnt % 2 != 0)//奇数结点
            {
                q->next = head;
                q = head;
            }
            else             //偶数结点
            {
                p->next = head;
                p= head;
            }
            cnt++;
            head = head->next;
        }
        p->next = NULL;
        q->next = oddList->next;
        return evenList->next; //注意这里生成的链表是包含头节点的,但是返回的链表不含头结点    
    }

};

ListNode *createByTail()

{

    ListNode *head;

    ListNode *p1, *p2=NULL;

    int n = 0, num;

    int len;

    cin >> len;

    head = NULL;

    while (n<len && cin >> num)

    {

        p1 = new ListNode(num);

        n = n + 1;

        if (n == 1)

            head = p1;

        else

            p2->next = p1;

        p2 = p1;

    }

    return head;

}

void  displayLink(ListNode *head)

{

    ListNode *p;

    p = head;

    cout << "head-->";

    while (p != NULL)

    {

        cout << p->val << "-->";

        p = p->next;

    }

    cout << "tail\n";

}

int main()

{

    ListNode* head = createByTail();

    head = Solution().oddEvenList(head);

    displayLink(head);

    return 0;

}

 

posted @ 2022-07-03 22:00  努力奋斗的小企鹅  阅读(42)  评论(0)    收藏  举报