如何将链表断开

2 篇文章 0 订阅
2 篇文章 0 订阅

今天我们来看一个链表的操作问题,题目要求编写一个函数,将链表分成奇数链和偶数链,每个链中的数据从小到大排列。程序中不得使用malloc申请空间

审题:首先不能使用malloc申请新的空间就是说不能申请新的链表来放奇数偶数链表。因此就需要在原来链表的基础上进行操作。但是进行操作时需要考虑,先排序还是先判断奇偶性。如果先判断奇偶性再排序会造成和排序函数在两个链表中调用2次。因此我们选择先排序在进行选择奇偶判断。在排序好的链表中先将这个链表从头断开,然后将后面那部分的链表一次向后进行判断,如果节点的数据域是奇数将其放到传入进来的头节点,如果是偶数放到原先的头节点。这样就能实现链表的断开和排序。
首先是参数问题,这个函数应该有几个参数?
我们函数最终的结果是产生2个链表,但是创建的链表只有一个,所以如果只有一个参数在函数中那么必然会导致断开链的丢失。因此我们需要再申请一个头来连接奇数链。其次就是这个所用指针的问题,这里采用三个指针。小编尝试了很多次双指针最后会导致后面部分节点链断不开。下面来看代码

void differ(SLIST* psl,SLIST* psl1)//先进行排序后再分奇偶
{
		slistSort(psl);
		//链表排序完成,p q 均指向链表最后排序的那个节点
		Listnode* S = psl->first;//避免链表散架定义新的指针指向链表,这个作为新的头
		Listnode* Temp = S->next;
		Listnode* P = Temp;
		psl->last = S;
		S->next = NULL;
		while (	P != NULL)//偶数链
			{
				Temp = P;
				if (Temp->data % 2 == 0)
				{
					psl->last->next = Temp;
					psl->last = Temp;
				}
				else//奇数链
				{
						psl1->last->next = Temp;
						psl1->last = Temp;
				}
				P =	P->next;
				Temp->next = NULL;//指针后移动
			}
}	


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值