帶頭結點的單鏈表就地逆置


因為只能順序訪問,所以不能用兩個指針一個一個的顛倒。

想的新思路是:從第二個結點開始,從鏈表上拆下來,往頭結點后面插入。

注意:因為每一次都把第二個元素拆下來,所以指針不用后移,每次都是拆那個位置。

 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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM