将单向链表reverse,如ABCD变成DCBA,只能搜索链表一次。
1 #include<stdio.h> 2 #include<stdlib.h> 3 typedef struct LNode{ 4 int data; 5 struct LNode *next; 6 }LNode,*LinkList; 7 void CreateList_L(LinkList &L,int n) 8 { 9 L=(LinkList)malloc(sizeof(LNode)); 10 L->next=NULL;//头结点 11 LinkList p,q; 12 p=L; 13 //p=p->next; 14 for(int i=0;i<n;i++) 15 { 16 q=(LinkList)malloc(sizeof(LNode)); 17 p->next=q; 18 //scanf("%d",&q->data);//在用“%c”格式输入字符时,空格字符和“转义字符”都作为有效字符输入 19 scanf("%c",&q->data); 20 //q->data=getchar(); 21 q->next=NULL; 22 p=q;//这下知道前驱指针的作用,只是还有些不明白为什么那样就会出错 23 }//顺序建立单链表 24 printf("链表创建成功!\n"); 25 } 26 void Reverse(LinkList &L,int n) 27 { 28 LinkList q=L,qt; 29 q=q->next; 30 for(int i=0;i<n;i++) 31 { 32 qt=(LinkList)malloc(sizeof(LNode)); 33 qt->data=q->data; 34 q=q->next; 35 qt->next=L->next; 36 L->next=qt; 37 } 38 printf("逆序成功!\n"); 39 } 40 void Display(LinkList L) 41 { 42 L=L->next; 43 while(L!=NULL) 44 { 45 printf("%c",L->data); 46 L=L->next; 47 } 48 } 49 int main() 50 { 51 LinkList L; 52 int n; 53 printf("输入你要创建的链表的大小:\n"); 54 scanf("%d",&n); 55 CreateList_L(L,n); 56 Display(L); 57 Reverse(L,n); 58 Display(L); 59 }
没有删除后面结点,现在不适合想,先存。