逆转单链表的优化算法, 不需要中间数组,来逆转, 直接上代码
#include <stdio.h>
#include <malloc.h>
typedef struct list_node {
int data;
struct list_node *next;
} list_node;
list_node *list_create(int elements[], int length) {
list_node *head = malloc(sizeof(list_node));
list_node *p = head;
head->data = elements[0];
head->next = NULL;
int i = 1;
for (; i < length; ++i) {
list_node *node = malloc(sizeof(list_node));
node->next = NULL;
node->data = elements[i];
p->next = node;
p = node;
}
return head;
}
list_node *list_reverse(list_node *head) {
list_node *previous, *link, *next_link;
previous = head;
link = previous->next;
next_link = link->next;
list_node * ret = NULL;
while (link) {
link->next = previous;
previous = link;
if (!next_link) {
ret = link;
break;
}
link = next_link;
next_link = next_link->next;
}
head->next = NULL;
return ret;
}
void list_traverse(list_node *head) {
list_node *p = head;
while (p) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main(int argc, char *argv[]) {
int elements[] = { 1, 3, 5, 6, 4, 555, 666, 34, 43, 0 };
list_node *head = list_create(elements, sizeof(elements) / sizeof(elements[0]));
list_traverse(head);
head = list_reverse(head);
list_traverse(head);
return 0;
}
结果