文章

63

粉丝

0

获赞

0

访问

13.4k

头像
2019年计算机学科专业基础综合试题 - 第41题回答
数据结构
发布于2025年10月14日 09:30
阅读数 190

(1)本算法的核心思想是将链表的重排问题分解为三个步骤:首先,利用快慢指针法(快指针每次走两步,慢指针每次走一步)找到链表的中间节点,以此将链表划分为前后两个子链表;其次,将后半部分的子链表进行就地逆序操作,使其顺序颠倒;最后,将前半部分的子链表与逆序后的后半部分子链表进行交替合并,即依次从两个子链表中各取一个节点进行穿插链接,直到后半部分子链表为空,从而得到最终的目标链表。整个过程通过有限的几个指针变量完成,保证了空间复杂度为O(1)。

(2)

// 题目给定的链表节点结构
typedef struct node {
    int data;
    struct node *next;
} NODE;

// 辅助函数:就地逆序一个单链表
// 输入:待逆序链表的头节点
// 返回:逆序后新链表的头节点
NODE* reverseList(NODE *head) {
    NODE *prev = nullptr; // 前驱指针,初始化为空
    NODE *curr = head;    // 当前指针,初始化为头
    
    while (curr != nullptr) {
        NODE *nextTemp = curr->next; // 暂存当前节点的后继
        curr->next = prev;           // 关键:将当前节点的next指针指向其前驱
        prev = curr;                 // 前驱指针后移
        curr = nextTemp;             // 当前指针后移
    }
    return prev; // 返回新的头节点
}

/**
 * @brief 对单链表L进行重排序
 * @param head 带头节点的单链表的头指针(这里假设传入的是第一个数据节点a1的指针)
 */
void reorderList(NODE *head) {
    // 步骤0: 处理边界情况,节点数小于3的链表无需重排
    if (head == nullptr || head->next == nullptr || head->...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发