第一类
将链表的头部指向尾部,再指向头部的第二个,再由头部的第二个指向尾部的第二个
例子
输入: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;
}