来源:考研题-第2章线性表-链表4-快慢指针和算法类
第5关:重新排列链表
任务描述
【2019年统考真题】
本关任务:带头节点的单链表L=(a1 ,a2,⋯,an−2,an−1,an )、结点结构[data][next],要求设计一个空间复杂度为O(1)且时间复杂度尽可能高效的算法,重新排列链表各结点,得到新链表为L=(a1,an,a2,an−1,a3,an−2,⋯)。
相关知识
为了完成本关任务,你需要掌握:1.如何创建链表,2.如何逆置链表。
编程要求
根据提示,在右侧编辑器Begin和End之间补充代码。
输入输出说明
输入包含两行,第一行元素个数n,第二行为相应的n个元素。
输出,重排后的链表。
测试说明
平台会对你编写的代码进行测试:
测试输入:
6
1 2 3 4 5 6
预期输出:
1 6 2 5 3 4
开始你的任务吧,祝你成功!
代码
具体思路是先将L截断,截断后用L保存前半部分、用p保存后半部分,特别注意截断的方法!然后再将后半部分进行倒置,最后再用双指针进行合并。
void Change_List(LinkList &L)
{
/*****************Begin*****************/
LinkList p;//滑动指针
LinkList L1,p1;//记录新指针
LinkList now,now1;//双指针合并
//求L的长度
int len=0;
p=L->next;
while(p)
{
len++;
p=p->next;
}
//找截点指针位置
len=(len-1)/2;
p=L->next;
while(len--)
p=p->next;
//截断L!!!!! 一定要找个中间指针保存如p
now=p;
p=p->next;
now->next=NULL;
//求倒置的L1
Init(L1);
while(p)
{
p1=p->next;
p->next=L1->next;
L1->next=p;
p=p1;
}
//双指针合并
p=L->next;
p1=L1->next;
while(p1)
{
now=p->next;
now1=p1->next;
p->next=p1;
p1->next=now;
p=now,p1=now1;
}
/****************End********************/
}
void Show(LinkList L)
{
LNode *p = L->next;
while(p)
{
cout << p->data << ' ';
p = p->next;
}
cout << endl;
}
完结撒花!如果这篇文章能够帮助你,请点赞收藏!