C语言指针-链表逆转

        昨晚看到庭波老师的日志说要实现链表逆转,点进去看了下。庭波老师的算法是把链表的数据读出来,用数组存起来,然后再逆向放到链表里。我觉得这个做法太暴力了,费内存还费时间。至少来说,建立一个数组(要都是链表不小的话)就耗掉好多内存,把数据倒腾来倒腾去,也会费掉好多时间。

        出于ACMer的直觉,我提出可以直接用指针实现,更加体现C语言指针的特性,也能省掉内存和时间。庭波老师可能最近讲了数组吧,一直掐着数组不放,说要建一个指针数组,然后给每个链表节点一个指针,然后再通过修改p->next来实现逆转。

        其实我说的用指针实现链表逆转指针,是用三个指针,然后就可以实现逆转了。。。。。。。

庭波老师的算法:


我的算法:


我的代码实现:


<span style="font-size:18px;">#include<stdio.h>
#include<stdlib.h>
using namespace std;
struct node{//链表节点
    int data;
    struct node *next;
}*head,*p1,*p2,*p3;//链表的头指针、其他指针

void new_node(){//新建链表,内容由输入确定,输入整形数据 用空格格开,输入“句号”结束输入
    int n,i;
    int a[]={1,2,3,4,5,6,7,8,9};//直接用数组实验,省去输入时间
    p1=(node *)malloc(sizeof(node));
    head=p1;
   // while(scanf("%d",&n)&&n!='.'){
    for(i=0;i<9;i++){//
        n=a[i];//
        p2=(node *)malloc(sizeof(node));
        p1->next=p2;
        p2->data=n;
        p2->next=NULL;
        p1=p2;
    }
}
void disp_node(){//显示链表内容
    p1=head;
    while(p1->next) printf("%d ",p1->next->data),p1=p1->next;
    printf("\n");
}

void reverse_node(){//逆转链表
    p1=head;
    p2=p1->next;
    p3=p2->next;
    while(p3->next){
        p1=p2;
        p2=p3;
        p3=p3->next;
        p2->next=p1;
    }
    p3->next=p2;
    head->next->next=NULL;
    head->next=p3;
}

int main(){
    new_node();//新建一个链表
    disp_node();//输出原链表
    reverse_node();//逆转链表
    disp_node();//再次输出链表,显示逆转后的链表
    return 0;
}
</span>



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值