题目描述
运用类结构的相关知识,构造链表类,完成奇偶链表合并:给定一个单链表,将所有的奇数节点和偶数节点分别排在一起(注意:这里的奇数节点和偶数节点指的是编号的奇偶性,而不是节点的值的奇偶性),并输出合并后的结果链表。 说明:
- 1.应当保持奇数节点和偶数节点的相对顺序。
- 2.链表的第一个节点视为奇数节点,第二个节点视为偶数节点,以此类推。
- 3.当输入链表节点个数为0时,输出“NULL”。
链表结构需按如下定义进行实现,其中Node类自行实现:
class List{
public:
Node* head;
Node* tail;
List(){head=NULL;};
void Insert(int n);//插入节点
void Print();//打印链表的数据项
void Solution();
};
输入
第一行一个整数N,代表有N组测试数据,接下来的N行每行第一个数为链表节点个数M,接下来为M个节点。
输出
奇数链表在前,偶数链表在后,输出合并之后的结果链表。 结果链表中每相邻元素之间使用空格隔开,最后一个节点后没有空格,每输出一个结果链表后换行。
样例输入
3
6 1 2 3 4 5 6
0
5 0 98 7 45 3
样例输出
1 3 5 2 4 6
NULL
0 7 3 98 45
#include <iostream>
using namespace std;
class Node {
public:
int val;
Node* next;
Node(int v = 0) : val(v), next(NULL) {}
};
class List {
public:
Node* head;
Node* tail;
List() {
head = NULL;
tail = NULL;
};
void Insert(int n);
void Print();
void Solution();
};
void List::Insert(int n) {
for (int i = 0; i < n; i++) {
int v; //此处输入链表的具体内容
cin >> v;
Node* tmp = new Node(v); //创建一个新结点,并直接赋值,注意new出来的是一个地址
if (tail == NULL) { //空链表,头尾指针均指向这个表项
head = tmp;
tail = tmp;
}
else { //链接在尾指针后面即可
tail->next = tmp;
tail = tail->next;
}
}
}
void List::Print() { //不用传参,可以直接访问本类的成员,head和tail
Node* p = head;
while (p != NULL) {
cout << p->val << " ";
p = p->next;
}
}
void List::Solution() {
if (head == NULL) { // 链表为空
cout << "NULL" << endl;
return;
}
Node* odd = head, * even = head->next;//创建两个新指针,奇数链表头和偶数链表头
Node* evenHead = even;
while (even != NULL && even->next != NULL) { // 将奇数节点和偶数节点分别排在一起
odd->next = even->next;
odd = odd->next;
even->next = odd->next;
even = even->next;
}
odd->next = evenHead; // 将奇数节点和偶数节点合并
Print(); // 输出结果
cout << endl;
}
int main() {
int T;
cin >> T;
for (int i = 0; i < T; i++) {
int M;
cin >> M;
List list;
list.Insert(M);
list.Solution();
}
return 0;
}