📅  最后修改于: 2023-12-03 15:11:15.694000             🧑  作者: Mango
本程序实现了将单链表以交替奇数和偶数节点顺序排列的功能,使用C++语言编写,主要涉及单链表的遍历和插入操作。
// 结点类型
struct Node {
int data;
Node *next;
Node(int x) : data(x), next(NULL) {}
};
// 以交替奇数和偶数节点顺序排列单链表函数
Node *alternateOrder(Node *head) {
// 头结点为空或者仅有一个结点,直接返回原链表头结点
if (!head || !head->next) {
return head;
}
Node *oddHead = new Node(-1); // 奇数节点链表头结点
Node *evenHead = new Node(-1); // 偶数节点链表头结点
Node *oddTail = oddHead; // 奇数节点链表尾节点
Node *evenTail = evenHead; // 偶数节点链表尾节点
bool isOdd = true; // 是否是奇数结点
// 遍历原链表,将奇数位置节点插入奇数节点链表中,偶数位置节点插入偶数节点链表中
while (head) {
if (isOdd) {
oddTail->next = head;
oddTail = head;
} else {
evenTail->next = head;
evenTail = head;
}
head = head->next;
isOdd = !isOdd;
}
// 合并奇数节点链表和偶数节点链表
oddTail->next = evenHead->next;
// 遍历新的链表,将奇数位置的节点为起点,将其后续的偶数节点插入到奇数节点的后面
Node *p = oddHead->next, *q;
while (p && p->next && p->next->next) {
q = p->next; // 偶数节点
p->next = q->next; // 奇数节点的后继指向偶数节点的后继
q->next = p->next->next; // 偶数节点的后继指向下一个奇数节点的前继
p->next->next = q; // 奇数节点的后继指向偶数节点
p = p->next->next; // 移动到下一个奇数节点位置
}
return oddHead->next; // 返回新链表的头结点
}
本程序实现了以交替奇数和偶数节点顺序排列单链表的功能。虽然单链表的操作比较繁琐,但只要理解了其基本原理和操作方法,就能够比较轻松地实现各种功能。此外,对于单链表的操作也能够很好地锻炼程序员的逻辑思维和编程能力。