文章
63
粉丝
0
获赞
0
访问
13.4k
(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->...
登录后发布评论
暂无评论,来抢沙发