单链表逆序、反转

这几天找工作,遇到一个挺好玩的笔试题,做完之后想了一个比较简单的实现方法。

题目是:实现一个单链表的逆序操作,如原来是A->B->C,操作完之后是C->B->A.废话少说,上干货.

  1 /******************************************
  2  * 文件名称:reverse.c
  3  * 文件描述:单链表逆序
  4              请注意:没有添加链表释放的函数,
  5              这个文件会造成内存泄露,请自己完善
  6  * 文件作者:by wangluojisuan, in 2013.11.27
  7  * 文件版本:1.2
  8  * 修改记录:
  9 *******************************************/
 10 #include <stdio.h>
 11 #include <stdlib.h>
 12 
 13 //定义链表节点,包含数据域data与指针域next
 14 typedef struct _link_node_ {
 15     int data;                                        //数据域
 16     struct _link_node_ *next;                        //指针域
 17 }linknode_t;
 18 
 19 //定义链表,包含链表头及链表最大长度,当前长度
 20 //链表头head不存储内容,head->next为第一个节点
 21 //建议采用这种链表定义方式,可以包含更多的链表信息
 22 typedef struct _link_list_ {
 23     int m_len;                                        //链表最大长度
 24     int c_len;                                        //链表当前长度
 25     linknode_t *head;                                //链表头
 26 }linklist_t;
 27 
 28 linklist_t * init_linklist(int len);                //初始化链表
 29 linknode_t * _create_linknode(int value);            //创建节点
 30 int insert_linklist(linklist_t *list, int value);    //链表中插入节点
 31 void show_linklist(linklist_t *list);                //显示链表内容
 32 void reverse_linklist(linklist_t *list);            //反转链表顺序
 33 
 34 int main(void)
 35 {
 36     //初始化链表
 37     //输出内容
 38     //反转链表
 39     //输出反转结果
 40     int i = 0;
 41     linklist_t *list = NULL;
 42 
 43     list = init_linklist(10);
 44     if (NULL == list)
 45         exit(-1);
 46 
 47     for (i = 0; i < 10; i++) {
 48         if (0 != insert_linklist(list, i))
 49             printf("error
");
 50     }
 51 
 52     show_linklist(list);
 53 
 54     reverse_linklist(list);
 55     show_linklist(list);
 56 
 57     return 0;
 58 }
 59 
 60 /*=====================================================
 61  * 函数名称:_create_linknode
 62  * 函数功能:创建链表节点,节点next指向NULL
 63  * 函数参数:int value    节点数据域的内容
 64  * 返 回 值:linknode *    创建好的链表节点,如果出错返回NULL
 65  * 创 建 人:by wangluojisuan,in 2013.11.27
 66  * 修改记录:
 67 ======================================================*/
 68 linknode_t * _create_linknode(int value)
 69 {
 70     linknode_t *node = NULL;
 71     
 72     node = (linknode_t *)malloc(sizeof(linknode_t));
 73     if (NULL == node)
 74         return NULL;
 75 
 76     node->data = value;
 77     node->next = NULL;
 78 
 79     return node;
 80 }
 81 
 82 /*=======================================================
 83  * 函数名称:init_linklist
 84  * 函数功能:初始化一个链表,并设置最大链表长度
 85  * 函数参数:int len     链表的最大长度
 86  * 返 回 值:linklist *
 87              成功  初始化好的链表
 88              失败  NULL
 89  * 创 建 人:by wangluojisuan,in 2013.11.27
 90  * 修改记录:
 91 ========================================================*/
 92 linklist_t * init_linklist(int len)
 93 {
 94     linklist_t *list = NULL;
 95 
 96     list = (linklist_t *)malloc(sizeof(linklist_t));
 97     if (NULL == list)
 98         return NULL;
 99 
100     list->m_len = len;    //设置最大长度
101     list->c_len = 0;    //设置当前长度
102     list->head = _create_linknode(0);    //头结点赋值
103 
104     return list;
105 }
106 
107 /*=======================================================
108  * 函数名称:insert_linklist
109  * 函数功能:向链表中插入数据,使用头插法,每次新插入的节点都
110              放在head的后面
111  * 函数参数:linklist_t *list     链表
112              int         value    插入节点数据域值
113  * 返 回 值:int
114              成功  0
115              失败  -1
116  * 创 建 人:by wangluojisuan,in 2013.11.27
117  * 修改记录:
118 ========================================================*/
119 int insert_linklist(linklist_t *list, int value)
120 {
121     linknode_t *node = NULL;
122 
123     if (list->c_len >= list->m_len)
124         return -1;
125 
126     node = _create_linknode(value);
127     node->next = list->head->next;
128     list->head->next = node;
129     (list->c_len)++;
130 
131     return 0;
132 }
133 
134 /*=======================================================
135  * 函数名称:show_linklist
136  * 函数功能:显示链表的内容
137  * 函数参数:linklist_t *list     链表
138  * 返 回 值:void
139  * 创 建 人:by wangluojisuan,in 2013.11.27
140  * 修改记录:
141 ========================================================*/
142 void show_linklist(linklist_t *list)
143 {
144     linknode_t *node = NULL;
145 
146     node = list->head->next;
147 
148     while (NULL != node) {
149         printf("%d  ", node->data);
150         node = node->next;
151     }
152 
153     printf("
");
154 }
155 
156 /*=======================================================
157  * 函数名称:reverse_linklist
158  * 函数功能:反转链表节点
159  * 函数参数:linklist_t *list     链表
160  * 返 回 值:void
161  * 创 建 人:by wangluojisuan,in 2013.11.27
162  * 修改记录:
163 ========================================================*/
164 void reverse_linklist(linklist_t *list)
165 {
166     linknode_t *current = NULL,
167                *pnext = NULL;
168 
169     current = list->head->next;
170     while(NULL != current->next) {
171         pnext = current->next;
172         current->next = pnext->next;
173         pnext->next = list->head->next;
174         list->head->next = pnext;
175     }
176 }

感觉自己写的比较容易懂了,有问题可以留言,或者QQ1262033368

原文地址:https://www.cnblogs.com/wangluojisuan/p/3445004.html