03 单链表逆置

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了03 单链表逆置相关的知识,希望对你有一定的参考价值。

 单链表逆置

方法:

<1>断开第一个数据节点和第二个数据节点的链接

<2>将后面的节点通过头插法的思想插在头节点后面

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <string.h>
  4 
  5 // 数据结构
  6 typedef struct node
  7 {
  8     int data;
  9     struct node *next;
 10 }linkList;
 11 
 12 // 创建单链表,并初始化
 13 linkList *linkList_init(void)
 14 {
 15     linkList *list = (linkList *)malloc(sizeof(linkList));
 16 
 17     if (list == NULL)
 18     {
 19         return NULL; 
 20     }
 21 
 22     list->next = NULL;
 23 
 24     return list;
 25 }
 26 
 27 // 添加到链表头
 28 int linkList_add_head(linkList *list, int data)
 29 {
 30     // 参数检查
 31     if (list == NULL)
 32     {
 33         return -1; 
 34     }
 35 
 36     linkList *node = (linkList *)malloc(sizeof(linkList));
 37     if (node == NULL)
 38     {
 39         return -2; 
 40     }
 41 
 42     node->data = data;
 43     node->next = list->next;
 44     list->next = node;
 45 
 46     return 0;
 47 }
 48 
 49 // 添加到链表尾 
 50 int linkList_add_tail(linkList *list, int data)
 51 {
 52     // 参数检查
 53     if (list == NULL)
 54     {
 55         return -1; 
 56     }
 57 
 58     linkList *node = (linkList *)malloc(sizeof(linkList));
 59     if (node == NULL)
 60     {
 61         return -2; 
 62     }
 63 
 64     node->data = data;
 65     node->next = NULL;
 66 
 67     // 找到最后一个节点
 68     linkList *tmp = NULL;
 69     for (tmp = list; tmp->next != NULL; tmp = tmp->next)
 70     {
 71         ;
 72     }
 73 
 74     tmp->next = node;
 75 
 76     return 0;
 77 }
 78 
 79 // 从头开始删除第一个节点,并保存到node中
 80 int linkList_del_head(linkList *list, linkList **node)
 81 {
 82     // 参数检查
 83     if (list == NULL || list->next == NULL)
 84     {
 85         return -1; 
 86     }
 87 
 88     *node = list->next;
 89 
 90     list->next = list->next->next;
 91 
 92     (*node)->next = NULL;
 93     return 0;
 94 }
 95 
 96 // 从尾部开始删除第一个节点,并保存到node中
 97 int linkList_del_tail(linkList *list, linkList **node)
 98 {
 99     // 参数检查
100     if (list == NULL || list->next == NULL)
101     {
102         return -1; 
103     }
104 
105     // 记录最后一个节点的前一个节点
106     linkList *tmp = NULL;
107     for (tmp = list; tmp->next->next != NULL; tmp = tmp->next)
108     {
109         ;
110     }
111 
112     *node = tmp->next;
113     (*node)->next = NULL;
114 
115     tmp->next = NULL;
116 
117     return 0;
118 }
119 
120 int linkList_printf(linkList *list)
121 {
122     // 参数检查
123     if (list == NULL || list->next == NULL)
124     {
125         return -1; 
126     }
127 
128     linkList *tmp = NULL;
129     for (tmp = list->next; tmp != NULL; tmp = tmp->next)
130     {
131         printf("%d-", tmp->data);
132     }
133     printf("\n");
134 
135     return 0;
136 }
137 
138 int linkList_destroy(linkList *list)
139 {
140     linkList *tmp = NULL;
141 
142     while (list != NULL)
143     {
144         tmp = list;
145         list = list->next;
146         free(tmp);
147         tmp = NULL;
148     }
149 
150     return 0;
151 }
152 
153 int linkList_reverse(linkList *list)
154 {
155     linkList *current = NULL;
156     linkList *tmp = NULL;
157 
158     // 参数检查
159     if (list == NULL || list->next == NULL)
160     {
161         return -1; 
162     }
163 
164     // 保存第二个节点
165     // 将第一个节点和第二个节点断开
166     current = list->next->next;
167     list->next->next = NULL;
168 
169     while (current != NULL)
170     {
171         // 记录current的下一个节点
172         tmp = current->next; 
173 
174         // 头插法
175         current->next = list->next;
176         list->next = current;
177 
178         // 更新current
179         current = tmp;
180     }
181 
182 
183     return 0;
184 }
185 
186 int main(void)
187 {
188     int i = 0;
189     linkList *list = NULL;
190     linkList *node = NULL;
191 
192     list = linkList_init();
193 
194     for (i = 0; i < 10; i++)
195     {
196         linkList_add_head(list, i); 
197     }
198 
199     linkList_printf(list);
200 
201     linkList_reverse(list);
202 
203     linkList_printf(list);
204 
205     linkList_destroy(list);
206 
207     return 0;
208 }

 

以上是关于03 单链表逆置的主要内容,如果未能解决你的问题,请参考以下文章

C++程序设计 编写程序实现单链表逆置功能。

单链表逆置

单链表逆置

单链表逆置

单链表类,链表逆置

对于"单链表逆置和递归"的问题的理解.