码迷,mamicode.com
首页 > 其他好文 > 详细

c 单链表反转(不添加新结点空间)

时间:2014-09-12 01:11:24      阅读:221      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   io   for   div   问题   sp   代码   

最近复习考研,加上一直都将"算法"放在很高的位置,所以,蛮重视算法的.不多说了,其实这个问题,不难理解的.

主要代码:

 1 //反转单链表.
 2 void
 3 reverse(linklist lList) {
 4     Linknode *pre = NULL;    //注意该结点不能再指向别的非空结点.
 5     Linknode *cur = lList->next;
 6     Linknode *next;
 7     while(cur) {    
 8         next = cur->next;
 9         cur->next = pre;
10         pre = cur;
11         cur = next;
12     }
13     lList->next = pre;
14 }

  我最近发现,算法这东西,光靠空想是很痛苦,很难理解的,我建议各位不懂的时候,多用笔,在纸上画图,对于数字型,同样是有效的.

完整代码:

 1 #include <stdio.h>
 2 #include <malloc.h>
 3 
 4 #define FALSE 0
 5 #define TRUE 1
 6 
 7 typedef struct node {
 8     int data;
 9     struct node *next;
10 } Linknode;
11 
12 typedef Linknode *linklist;
13 
14 linklist
15 init(int);
16 
17 void
18 traverse(linklist);
19 
20 void
21 reverse(linklist);
22 
23 int
24 main(void) {
25     int n = 10;
26     linklist lList = init(n);
27     traverse(lList);
28     reverse(lList);
29     traverse(lList);
30 }
31 
32 //根据指定结点的个数,初始化一个带有头结点的单链表.
33 linklist
34 init(int n) {
35     linklist lList = (linklist)malloc(sizeof(struct node));    //头结点.
36     lList->next = NULL;    //初始时链表为空.
37     lList->data = n;    //头结点存储总元素个数.
38     if(!lList) {
39         printf("out of memory!\n");
40         return FALSE;
41     }
42     int i;
43     Linknode * tail = lList;
44     for(i = 0; i < n; i++) {
45         Linknode * nNew = (Linknode *)malloc(sizeof(struct node));
46         if(!nNew) {
47             printf("out of memory!\n");
48             return FALSE;
49         }
50         nNew->data = i + 1;    //为新结点赋值.
51         //重新指定尾结点.
52         tail->next = nNew;
53         tail = nNew;
54         nNew->next = NULL;
55     }
56     return lList;
57 }
58 
59 //遍历单链表所有结点.
60 void
61 traverse(linklist lList) {
62     Linknode * node;
63     node = lList->next;    //开始时指向第一个结点.
64     while(node) {
65         printf("%d ", node->data);
66         node = node->next;
67     }
68     printf("\n");
69     return;
70 }
71 
72 //反转单链表.
73 void
74 reverse(linklist lList) {
75     Linknode *pre = NULL;    //注意该结点不能再指向别的非空结点.
76     Linknode *cur = lList->next;
77     Linknode *next;
78     while(cur) {    
79         next = cur->next;
80         cur->next = pre;
81         pre = cur;
82         cur = next;
83     }
84     lList->next = pre;
85 }

 

我网上搜了一下,有蛮多人写的,我这里就写一种方法就行了,至于开辟新节点空间的方式,我觉得是小儿科的.

 

c 单链表反转(不添加新结点空间)

标签:style   blog   color   io   for   div   问题   sp   代码   

原文地址:http://www.cnblogs.com/listened/p/3967545.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!