带头结点的单链表就地逆置


因为只能顺序访问,所以不能用两个指针一个一个的颠倒。

想的新思路是:从第二个结点开始,从链表上拆下来,往头结点后面插入。

注意:因为每一次都把第二个元素拆下来,所以指针不用后移,每次都是拆那个位置。

 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