两两反转

两两反转

  太长时间没写代码了,在华科的真题上看到了这个题,顺手写了一下,练了下递归,写给自己看。题目大意是给出一个带头结点的单链表,现要两两反转,例如原链表是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++混在一起写的,需要多加练习。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值