因为只能顺序访问,所以不能用两个指针一个一个的颠倒。
想的新思路是:从第二个结点开始,从链表上拆下来,往头结点后面插入。
注意:因为每一次都把第二个元素拆下来,所以指针不用后移,每次都是拆那个位置。
1 #include<stdio.h> 2 #include<malloc.h> 3 #include<stdlib.h> 4 5 6 #define TRUE 1 7 #define FALSE 0 8 #define OK 1 9 #define ERROR 0 10 #define INFEASIBLE -1 11 #define OVERFLOW -2 12 13 typedef int Status; 14 typedef int ElemType; 15 16 typedef struct LNode 17 { 18 ElemType data; 19 struct LNode *next; 20 }LNode,*LinkList; 21 22 Status ListCreate_L(LinkList &L,int n) 23 { 24 LNode *rearPtr,*curPtr; 25 L=(LNode*)malloc(sizeof (LNode)); 26 if(!L)exit(OVERFLOW); 27 L->next=NULL; 28 rearPtr=L; 29 for (int i=1;i<=n;i++){ 30 curPtr=(LNode*)malloc(sizeof(LNode)); 31 if(!curPtr)exit(OVERFLOW); 32 scanf("%d",&curPtr->data); 33 curPtr->next=NULL; 34 rearPtr->next=curPtr; 35 rearPtr=curPtr; 36 } 37 return OK; 38 } 39 void ListReverse_L(LinkList &L); 40 void ListPrint_L(LinkList &L) 41 { 42 LNode *p=L->next; //p指向第一个元素结点 43 while(p!=NULL) 44 { 45 if(p->next!=NULL) 46 printf("%d ",p->data); 47 else 48 printf("%d",p->data); 49 p=p->next; 50 } 51 } 52 int main() 53 { 54 LinkList L; 55 int n; 56 scanf("%d",&n); 57 if(ListCreate_L(L,n)!= OK) { 58 printf("表创建失败!!!\n"); 59 return -1; 60 } 61 ListReverse_L(L); 62 ListPrint_L(L); 63 return 0; 64 }//上面的都是测试程序 65 /////////////////////////////////////////////// 66 //就这么点: 67 68 void ListReverse_L(LinkList &L)//从第二个结点开始一个一个结点拿到最前面 69 { 70 if(L->next==NULL) 71 return; 72 73 LNode *p,*q;//p用来遍历,q用来拆结点 74 p=L->next; 75 while(p->next!=NULL) 76 { 77 q=p->next;//q存下结点 78 p->next=q->next;//把该结点去掉 79 80 q->next=L->next;//把该结点放到最前面 81 L->next=q; 82 83 //p=p->next;//p指针后移 84 } 85 86 87 }