最近复习考研,加上一直都将"算法"放在很高的位置,所以,蛮重视算法的.不多说了,其实这个问题,不难理解的.
主要代码:
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 }
我网上搜了一下,有蛮多人写的,我这里就写一种方法就行了,至于开辟新节点空间的方式,我觉得是小儿科的.