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 单链表逆置的主要内容,如果未能解决你的问题,请参考以下文章