奇偶链表的分割

描述

 

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

要求:空间复杂度应为 O(1),时间复杂度应为 O(n),n 为链表结点总数。

 

输入

多组数据,每组数据有两行,第一行为链表的长度n,第二行为链表的n个元素(元素之间用空格分隔)。当n=0时输入结束。

输出

奇数结点和偶数结点分割后重新链成的新链表。

输入样例 1 

5
1 2 3 4 5
3
1 5 6
4
15 2 3 4
0

输出样例 1

1 3 5 2 4
1 6 5
15 3 2 4
 

算法很简单,用三个计数器做就可以了,思路很简单。

#include<iostream>
using namespace std;

typedef struct LNode {
    LNode* next;
    int data;
}LNode,*LinkList;

void Init_List(LinkList& L) {
    L = new LNode;
    L->next = NULL;
}

void CreateList(LinkList& L,int n) {
    LinkList H=L;
    for (int i = 0; i < n; i++) {
        LinkList p = new LNode;
        cin >> p->data;
        p->next = H->next;
        H->next = p;
        H = p;
    }
}

void change(LinkList& L,int n) {
    LinkList p=L->next;
    LinkList t = L, end;
    while (p->next) 
        p = p->next;
    end = p;
    p = L->next;
    int m = 1;
    while(m<=n) {
        if (m % 2 == 1) {
            m++;
            p = p->next;
            t = t->next;
        }
        else if (m %2== 0) {
            t->next = t->next->next;
            end->next = p;
            p->next = NULL;
            end = end->next;
            p = t->next;
            m++;
        }
    }
    p = L->next;
    while (p->next) {
        cout << p->data << " ";
        p = p->next;
    }
    cout << p->data << endl;
}

int main() {
    while (1) {
        int n;
        cin >> n;
        if (n == 0)
            break;
        LinkList L;
        Init_List(L);
        CreateList(L, n);
        change(L, n);
    }
    return 0;
}

 

posted @ 2020-10-25 23:56  奕玑  阅读(409)  评论(0)    收藏  举报