题解 | #牛牛的链表交换#
牛牛的链表交换
http://www.nowcoder.com/practice/0e009fba6f3d47f0b5026b5f8b0cb1bc
#include <stdio.h>
#include <stdlib.h>
typedef struct list{
int data;
struct list *next;
}list,*linklist;
//链表内容打印
void ptink(list *head)
{
struct list *point=head;
while(point!=NULL)
{
printf("%d ",point->data);
point=point->next;//while里面的判断其实是在判断point->next是否为NULL
}
putchar('\n');
}
//链表结点个数计算
int get_Node_nums(list *head)
{
list *point=head;
int num=0;
while(point!=NULL)
{
num++;
point=point->next;
}
return num;
}
#if 1
list *exc(list *head) //前面两个交换
{
list *point=head;
int t,n;
n=get_Node_nums(head)-2;
if(get_Node_nums(head)==1)
{
return point;
}
else if(get_Node_nums(head)==2)
{
t=point->data;
point->data=point->next->data;
point->next->data=t;
return point;
}
else if(get_Node_nums(head)>2)
{
t=point->data;
point->data=point->next->data;
point->next->data=t;
list *p=point;
while(n--)
{
p = p->next ;
}
t=p->data;
p->data=p->next->data;
p->next->data=t;
}
return point;
}
int main()
{
int i,n;
scanf("%d",&n);
int arr[n];
for(i=0;i<n;i++)
{
scanf("%d",&arr[i]);
}
//链表的创建
list *headList = NULL;
list *arrList = NULL;
list *excList = NULL;
//这里用头插法
for(i=n-1;i>=0;i--)
{
arrList = (list *)malloc(sizeof(list));
arrList->data = arr[i];
arrList->next =headList; //将headList放在arrList->next,即arrList的数据是放在headList的前面的
headList = arrList; //再将headList指向arList保证头是headList
}
excList=exc(headList);
ptink(excList);
return 0;
}
#endif
#include <stdlib.h>
typedef struct list{
int data;
struct list *next;
}list,*linklist;
//链表内容打印
void ptink(list *head)
{
struct list *point=head;
while(point!=NULL)
{
printf("%d ",point->data);
point=point->next;//while里面的判断其实是在判断point->next是否为NULL
}
putchar('\n');
}
//链表结点个数计算
int get_Node_nums(list *head)
{
list *point=head;
int num=0;
while(point!=NULL)
{
num++;
point=point->next;
}
return num;
}
#if 1
list *exc(list *head) //前面两个交换
{
list *point=head;
int t,n;
n=get_Node_nums(head)-2;
if(get_Node_nums(head)==1)
{
return point;
}
else if(get_Node_nums(head)==2)
{
t=point->data;
point->data=point->next->data;
point->next->data=t;
return point;
}
else if(get_Node_nums(head)>2)
{
t=point->data;
point->data=point->next->data;
point->next->data=t;
list *p=point;
while(n--)
{
p = p->next ;
}
t=p->data;
p->data=p->next->data;
p->next->data=t;
}
return point;
}
int main()
{
int i,n;
scanf("%d",&n);
int arr[n];
for(i=0;i<n;i++)
{
scanf("%d",&arr[i]);
}
//链表的创建
list *headList = NULL;
list *arrList = NULL;
list *excList = NULL;
//这里用头插法
for(i=n-1;i>=0;i--)
{
arrList = (list *)malloc(sizeof(list));
arrList->data = arr[i];
arrList->next =headList; //将headList放在arrList->next,即arrList的数据是放在headList的前面的
headList = arrList; //再将headList指向arList保证头是headList
}
excList=exc(headList);
ptink(excList);
return 0;
}
#endif
查看10道真题和解析