首页 > 代码库 > c 单链表反转(不添加新结点空间)

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 linklist15 init(int);16 17 void18 traverse(linklist);19 20 void21 reverse(linklist);22 23 int24 main(void) {25     int n = 10;26     linklist lList = init(n);27     traverse(lList);28     reverse(lList);29     traverse(lList);30 }31 32 //根据指定结点的个数,初始化一个带有头结点的单链表.33 linklist34 init(int n) {35     linklist lList = (linklist)malloc(sizeof(struct node));    //头结点.36     lList->next = NULL;    //初始时链表为空.37     lList->data = http://www.mamicode.com/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 = http://www.mamicode.com/i + 1;    //为新结点赋值.51         //重新指定尾结点.52         tail->next = nNew;53         tail = nNew;54         nNew->next = NULL;55     }56     return lList;57 }58 59 //遍历单链表所有结点.60 void61 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 void74 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 单链表反转(不添加新结点空间)