C语言指针-链表逆转

来源:互联网 发布:java设置cookie失效 编辑:程序博客网 时间:2024/05/29 04:02

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

        出于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>



0 0