📌  相关文章
📜  用于以交替奇数和偶数节点顺序排列单链表的 C++ 程序(1)

📅  最后修改于: 2023-12-03 15:11:15.694000             🧑  作者: Mango

用于以交替奇数和偶数节点顺序排列单链表的 C++ 程序

本程序实现了将单链表以交替奇数和偶数节点顺序排列的功能,使用C++语言编写,主要涉及单链表的遍历和插入操作。

实现思路
  1. 遍历单链表,将所有奇数位置节点插入一个新的奇数节点链表中,所有偶数位置节点插入一个新的偶数节点链表中;
  2. 合并奇数节点链表和偶数节点链表,使得奇数节点链表的尾部指向偶数节点链表的头部;
  3. 遍历新的链表,以奇数位置的节点为起点,将其后续的偶数节点插入到奇数节点的后面。
代码片段
// 结点类型
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; // 返回新链表的头结点
}
总结

本程序实现了以交替奇数和偶数节点顺序排列单链表的功能。虽然单链表的操作比较繁琐,但只要理解了其基本原理和操作方法,就能够比较轻松地实现各种功能。此外,对于单链表的操作也能够很好地锻炼程序员的逻辑思维和编程能力。