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

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

主要代码:

 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 }

 

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

 

转载于:https://www.cnblogs.com/listened/p/3967545.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值