链表关于链表合并和反转的两类题型

第一类

将链表的头部指向尾部,再指向头部的第二个,再由头部的第二个指向尾部的第二个
例子

输入:1,3,5,7,8,9,0
输出:1,0,3,8,5,8,7

这里我的思路是先将将一条表分为两段从中间截断,这时候我们将第二条链表反转,最后将他们有序的合并就可以达成目的

link1* fanzhuan (link1 *p)
{
	link1 *p1,*p2,*tem;
	p1 =p;
	p2 =p->next;
	p1 ->next =NULL;
	tem =p2 ->next;
	while (p2!=NULL)
	{
	//	puts ("1");
		p2 ->next =p1;
		p1=p2;
		p2=tem;
		if (tem ==NULL)
			break;
		tem =tem ->next;
	}
	return p1;
}

void list_hebing_text(link1 *p)
{
	if (NULL ==p)
		exit(-1);
	link1 *p_two =p;
	link1 *pre1,*pre2;
	link1 *p_head=p;
	int len=link_len(p); 
	//求出链表的长度
	len=len/2;
	while (len !=0)
	{
		pre1=p_two;
		len--;
		p_two=p_two ->next;
	}
	pre1->next=NULL;
	//将他分成两个结点
	p_two=fanzhuan(p_two);
	//将第二条链表反转
	pre2 =p_two;
	pre1 =p_head;
	//将两个链表合并
	while (1)
	{
		pre1=p_head->next;
		pre2=p_two->next;
		p_head ->next =p_two;
		p_two->next=pre1;
		p_head=pre1;
		p_two=pre2;

		pre1=pre1->next;
		pre2=pre2->next;
		if (pre1 ==NULL)
		{
			pre1=p_two;
			printf ("per=%d\n",p_head->next->data);
			break;
		}
		if (pre2 ==NULL)
		{
			pre2=p_head;
			break;
		}
	}	
}

第二类

同样的还有第二类问题,就是求出链表的的结构是否满足回文的结构
例子

1,2,3,4,5,4,3,2,1
正确
1,3,5,6,7,9,4,2,6
错误

这种题的思路和原来一样,我们也是将他分为两段,将第二段反转,然后直接进行比较

link1* fanzhuan (link1 *p)
{
	link1 *p1,*p2,*tem;
	p1 =p;
	p2 =p->next;
	p1 ->next =NULL;
	tem =p2 ->next;
	while (p2!=NULL)
	{
	//	puts ("1");
		p2 ->next =p1;
		p1=p2;
		p2=tem;
		if (tem ==NULL)
			break;
		tem =tem ->next;
	}
	return p1;
}

int link_same(link1* head) {
	if (head ==NULL)
		return 0;
	link1 *p_one =head,*tep,*p_two,*p_new;
	int len=0;
	while (p_one != NULL)
	{
		len++;
		p_one=p_one ->next; 
	}
	len =len/2;
	if (len ==0)
		return 1;
	p_one=head;
	while (len !=0)
	{
		tep=p_one;
		p_one=p_one ->next;
		len--;
	}
	//反转
	p_two=p_one;
	p_one =head;

	p_two=fanzhuan(p_two);
	while (tep !=NULL)
	{
		tep ->next =p_two;	
		p_two =tep;
		tep =p_new;
		if (p_new ==NULL)
		{
			break;
		}
		p_new=p_new->next;
	}	
	//比较
	while (p_two ->next !=NULL && p_one->next !=NULL)
	{
		if (p_one ->data != p_two->data)
		{
			return 0;
		}
		p_two=p_two ->next;
		p_one=p_one ->next;
	}
	return 1;

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值