不借助辅助空间,直接逆序单链表

来源:互联网 发布:macbook pro 2017 知乎 编辑:程序博客网 时间:2024/05/18 04:00

        这是大半年前遗留的问题,今天来解决了。

        代码:

        

#include <stdio.h>#include <conio.h>#include <stdlib.h>//结构体定义struct list{int data;struct list *next;};typedef struct list NODE;typedef NODE *LINK;//函数原型void print_all(LINK ptr);LINK reverse(LINK head);int main(){LINK ptr,head;int num,i;ptr=(LINK)malloc(sizeof(NODE));head=ptr;//测试10个数据for(i=0;i<=9;i++){ptr->data=i+1;ptr->next=(LINK)malloc(sizeof(NODE));if(i==9) ptr->next=NULL;else ptr=ptr->next;}//输出ptr=head;print_all(ptr);//逆序单链表head=reverse(head);//输出ptr=head;print_all(ptr);getch();}//打印链表void print_all(LINK ptr){int i=0;while(ptr!=NULL){printf("%d ",ptr->data);ptr=ptr->next;}printf("\n");}//不借助辅助空间,直接逆序单链表//练手小程序,没有考虑其健壮性和容错性,请保证结点个数大于3LINK reverse(LINK head)//注意这个函数需要一个返回值,但没有完全明白这里传递地址的机制。问一下!{LINK p1=head;LINK p2=p1->next;LINK p3=p2->next;p1->next=NULL;p2->next=p1;while(p3!=NULL){p1=p2;p2=p3;p3=p3->next;p2->next=p1;}return p2;}
        reverse函数中有个传值的问题没有完全明白,我的理解是传递一个指针后,这个指针的指向发生了变化,所以需要返回逆序后的head。如果您知道原因,请告诉小弟我,非常感谢。