因為只能順序訪問,所以不能用兩個指針一個一個的顛倒。
想的新思路是:從第二個結點開始,從鏈表上拆下來,往頭結點后面插入。
注意:因為每一次都把第二個元素拆下來,所以指針不用后移,每次都是拆那個位置。
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 }