好久没写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 » 单向链表翻转