单向链表翻转

2016-05-27 23:59:20 1185

好久没写C代码了,看到微博上有人出了这个题。手痒写一下。指针这个东西,用得好妙笔生花,用得不好就会各种踩坑。

至于链表,主要是要考虑好它的结构。可以画图来帮助思考。然后就是注意一些变量的变化。

01 #include <string>
02 #include <cstring>
03 #include <iostream>
04 #include <cstdio>
05 using namespace std;
06 #define LL long long
07  
08 struct node{
09        int x;
10        node *next;
11 };
12 //输出
13 int printlist(node *ps){
14     while(ps!=NULL){
15        printf("%d %d %d\n",ps,ps->x,ps->next);
16        ps=ps->next;
17     }
18     return 0;
19 }
20 //翻转
21 node *overturn(node *start){
22          //开始反转
23     node *ps=start;
24     node *tmp=NULL;
25     node *last=NULL;
26     while(ps!=NULL){
27         //保存原链表中,这个节点指向的下一个节点。
28         tmp=ps->next;
29         //将当前节点指向上一个节点
30         ps->next=last;
31         last=ps;       
32         ps=tmp;
33     }
34     start=last;
35     return start;
36 }
37   
38 node *init(){
39     node *start=NULL;
40     node *last=NULL;
41     node *ps=start;
42     int x,num;
43     scanf("%d",&num);
44     for(int i=0;i<num;i++){
45         scanf("%d",&x);
46         node *ps=new node;
47                 
48         //链表赋值
49         ps->x=x;
50         ps->next=NULL;
51  
52         //让上一个指针向它
53         if(last==NULL){   
54             start=ps;
55         }else{
56             last->next=ps;
57         }
58         last=ps;
59     }
60     return start;
61 }
62  
63 int deletelist(node *ps){
64     node *tmp;
65     while(ps!=NULL){
66        tmp=ps;
67        ps=ps->next;
68        delete tmp;
69     }
70 }
71  
72 int main(void)
73 {
74     //数据输入
75     node * start=init();
76     //输出链
77     printlist(start);
78     //分割线
79     printf("\n");
80     //翻转
81     start= overturn(start);
82     //输出链
83     printlist(start);
84     //回收内存
85     deletelist(start);
86     start=NULL;
87     return 0;
88 }

 

转载请注明:旅途@KryptosX » 单向链表翻转

作者

kryptosx
TA的文章

相关文章