数据结构—链表-单链表应用-拆分链表

拆分单链表
这里写图片描述
这里写图片描述
算法是函数需要三个指针类型的参数,分别是L头指针,指针L1和指针L2
我们先设置一个p指针,他指向L->next,即第一个节点,再定义p和r1两个指针。
首先我们令L1等于L即L1这个指针执行L指向的区域,即L1指向头节点。
再让r1指向L1,现在L,L1,r1都指向头节点了。
我们再给L2即拆分后的一个链表分配内存,此时L2就是一个相应类型的头节点了。L2->next指向NULL;
对于a1、a2这样的节点,我们要让他们在L1中,而第二个第四个这样的节点,我们要用头插法,把他们插到L2中去。
当p!=NULL;
我们使r1->next=p
注意现在p是什么 p=L->next; 即p是指向头节点后一个节点的指针
即r1->next指向头指针L后一个节点,此时r1又指向L1,注意L1和L的不同,
L是原链表的头指针,他因为malloc函数指向了一个头节点,而L1也指向了这个节点。
r1->next=p;
r1=p;
p=p->next;
q=p->next;
这一段代码的真实含义很深刻
即r1 (指向L1的指针,L1是指向L1这个链表的头节点的指针,其实L1链表就是L链表)
r1->next指向p即r1和a1这个节点连接起来了。即首节点和a1这个节点连接起来了
r1=p;r1指向了第一个节点a1,我们已经使L1指向a1了L1又是头指针,我们也保存下来了。
p=p->next; 这代表p指向了a1的下一个节点,即b1。
q=p->next;代表q指向了p的下一个节点,即b1后面的一个节点,a2.
此时,r1指向a1,p指向b1,q指向a2。
此时,我们要做的是让p指向的b1插入到L2中,以达到分离链表的结果。
我们为什么需要q指针呢,因为一旦我们将p指针指向的节点,插入到L2中,a1和a2的连接就会断掉,我们需要一个q来保存a2。

p->next=L2->next;
L2->next=p;
p=q;

p->next=L2->next;代表p->next指向空,此时L1中的链就断掉了,所以我们需要q来指向a2,防止a2丢失。
L2->next指向p;目的达成,成功将b1插入到L2中了。
p=q; p再次指向a2。
注意原来在进入while循环时,p指向的是a1,这代表我们又回到原来的境地了。
并且注意,L2是头插法 ,L1是尾插法。
r1是L1的头指针,他一直承担着,r1->next=p即连接an节点,和r1=p,从上一个an-1节点指向下一个an节点
p呢是一个移动指针,他承担着将bn节点连接到L2上的责任。
而q呢,他是一个保存指针,他的责任是,当p和L2连接时,保存an节点的作用。
最后当an不存在时,p指向了NULL,退出循环。
而此时r1是L1中的最后一个节点,我们让它的next指向NULL;

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值