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 }

 

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

 

你可能感兴趣的:(单链表)