两两反转
太长时间没写代码了,在华科的真题上看到了这个题,顺手写了一下,练了下递归,写给自己看。题目大意是给出一个带头结点的单链表,现要两两反转,例如原链表是1 2 3 4,那么反转后为2 1 4 3,再如1 2 3 4 5,则反转后变为2 1 4 3 5。
代码
#include <stdio.h>
typedef struct node
{
int data;
struct node *next;
}node;
void print(node *list)
{
while(list=list->next) printf("%d ",list->data);
}
void dfs(node *ptr)
{
if(ptr->next==NULL||ptr->next->next==NULL) return;
dfs(ptr->next->next);
node *p1 = ptr->next;
node *p2 = ptr->next->next;
ptr->next = p2;
p1->next = p2->next;
p2->next = p1;
}
int main()
{
// freopen("in.txt","r",stdin);
node *list = (node*)malloc(sizeof(node));
list->next=NULL;
int n,number;
scanf("%d",&n);
while(n--)
{
node *p=(node*)malloc(sizeof(node));
scanf("%d",&number);
p->data=number;
p->next=NULL;
node *pos = list;
while(pos->next) pos=pos->next;
pos->next=p;
}
dfs(list);
print(list);
return 0;
}
/*
测试数据
1
1
测试结果
1
*/
/*
测试数据
2
1 2
测试结果
2 1
*/
/*
测试数据
10
10 9 8 7 6 5 4 3 2 1
测试结果
9 10 7 8 5 6 3 4 1 2
*/
这个题用循环写比较好想,我这里用递归实现的。纯C的代码写起来一点也不顺手,以前都是C和C++混在一起写的,需要多加练习。