【头歌】重新排列链表

来源:考研题-第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;
}

完结撒花!如果这篇文章能够帮助你,请点赞收藏!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值