奇偶链表的分割
描述
给定一个单链表,把所有的奇数结点和偶数结点分别排在一起,重新链成一个新链表。请注意,这里的奇数结点和偶数结点指的是结点编号的奇偶性,而不是结点的值的奇偶性。
要求:空间复杂度应为 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; }