链表:将一个链表拆分为两个列表,一个顺序一个逆序

题目:设C={a1,b1,a2,b2…an,bn}为线性表,采用带头节点的hc单链表存放,设计一个就地算法,将其线性表拆分为两个线性表,使得A={a1,a2,a3…an},B={bn,bn-1,…b2,b1}。

分析:因为链表A是顺序存放,所以用尾插法,而链表B是逆序存放,所以用头插法,根据链表C的特征,可见是尾插一次头插一次,一直循环直到把链表C拆分完。
(口诀:头插防断链,尾插留指针!)留的是尾指针

算法思想:遍历C链表,
第一个结点a1尾插在链表A(因为尾插是顺序插入),
第二个结点b1头插在链表B(因为头插是逆序插入),
第三个结点a2尾插在链表A,
第四个结点b2头插在链表B,
照此以往,直到将链表C拆分为A、B两个链表。

代码

Linklist create_AB(Linklist &hc){
	LNode *r; //r是头插是防止断链要用的
	LNode *p=hc->next; //p是工作指针,用来遍历
	//申请头结点,因为题目里没给
	A=(Linklist)malloc(sizeof(LNode));
	B=(Linklist)malloc(sizeof(LNode));
	A->next=Null; //链表A的第一个指针置空
	LNode *ra=A;  //ra表示A的尾指针
	B->next=Null; //链表B的第一个指针置空
	LNode *rb=B; //rb表示B的尾指针
	while(p!=Null){
		ra->next=p; //尾插法,必会
		ra=p;
		p=p->next;
		if(p!=Null){ //判断如果给A插完了还有数据,就给B插
			r=p->next; //r放p后面,防止断链
			p->next=rb->next; //头插法,必会
			rb->next=p;
			p=r;
		}
	}
	return A;
	return B;
}
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花间半盘棋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值