單向列表倒置:
算法示例:
head end tmp
1---->2---->3---->4---->5
end head tmp
2---->1 3---->4---->5
head end tmp
2---->1 3---->4---->5
end head tmp
3---->2---->1 4---->5
head end tmp
3---->2---->1 4---->5
end head tmp
4---->3---->2---->1 5
head end tmp
4---->3---->2---->1 5 NULL
end head
5---->4---->3---->2---->1
示例代碼:
[cpp]
#include <stdio.h>
#include <stdlib.h>
typedef struct LIST_NODE {
struct LIST_NODE* next;
int value;
}LIST_NODE;
LIST_NODE* list_inversion(LIST_NODE *head) {
printf("in list_inversion\n");
LIST_NODE *tmp, *end;
end = head->next;
tmp = end->next;
head->next = NULL;
while (NULL != tmp) {
end->next = head;
head = end;
end = tmp;
tmp = tmp->next;
}
end->next = head;
return end;
}
int main() {
LIST_NODE *head, *end;
head = (LIST_NODE*)malloc(sizeof(LIST_NODE)*1);
end = (LIST_NODE*)malloc(sizeof(LIST_NODE)*1);
LIST_NODE* tmp = (LIST_NODE*)malloc(sizeof(LIST_NODE)*1);
int len = 0, value = 0;
printf("Input length of list :\n");
scanf("%d", &len);
tmp = head;
for(int i= 0; i < len; i++) {
LIST_NODE* tmp2 = (LIST_NODE*)malloc(sizeof(LIST_NODE)*1);
printf("Input the current value : ");
tmp->next = tmp2;
if (i == len-1) {
tmp->next = NULL;
}
scanf("%d", &value);
tmp->value = value;
tmp = tmp->next;
}
LIST_NODE *aList = list_inversion(head);
printf("new list : \n");
while (NULL != aList) {
printf("%d\n", aList->value);
aList= aList->next;
}
}
示例運行結果:
[root@localhost List]# ./listtest
Input length of list :
5
Input the current value : 1
Input the current value : 2
Input the current value : 3
Input the current value : 4
Input the current value : 5
in list_inversion
new list :
5
4
3
2
1