反序排列一个单链表--C和指针,12.8.4
主要思路是:
1.计算链表的节点
2.从而为一个指针数组分配内存,每个元素都是一个指向节点的指针,例如 NODE * temp[3] = {NODE*p1,NODE*p2,NODE*p3};
3. 将每个结构赋给上述的指针
4.使当前结构内的指针成员,例如p3->fwd = p2, p2->fwd = p1 ....
1 # include <stdio.h> 2 # include <stdlib.h> 3 4 struct NODE { 5 int value; 6 struct NODE * fwd; 7 }Node; 8 struct NODE* sll_reverse(struct NODE* first); 9 10 int main() 11 { 12 NODE a, b, c;
13 c = { 15,NULL }; 14 b = { 10, &c }; 15 a = { 5, &b };
16 NODE* first = &a;
17 while (first !=NULL) /打印原先的链表内各节点的value 18 { 19 printf("%d ", first->value); 20 first = first->fwd; 21 } 22 putchar('\n'); 23 24 first = sll_reverse(&a); 25 26 27 while (first) //重新排序后 28 { 29 printf("%d ", first->value); 30 first = first->fwd; 31 } 32 33 return 0; 34 35 } 36 struct NODE* sll_reverse(struct NODE* first) 37 { 38 NODE* temp = first; 39 if (first == NULL) //空链表 40 return NULL; 41 42 int count = 0; 43 while (temp) //节点计数 44 { 45 count += 1; 46 temp = temp->fwd; 47 } 48 49 NODE**reverse_node = (NODE**)malloc(sizeof(NODE*) * count); //指针数组 50 if (reverse_node == NULL) 51 { 52 printf("Fail to allocate memeory"); 53 exit(1); 54 } 55 56 reverse_node[0] = first; //为数组的元素分配节点 57 for(int i = 1; i< count;i++) 58 { 59 reverse_node[i] = first->fwd; 60 first = first->fwd; 61 } 62 63 first = reverse_node[count-1]; //改变节点内指针的对象 64 while ((count -2)>=0) 65 { 66 reverse_node[count-1]->fwd = reverse_node[count - 2]; 67 count--; 68 } 69 reverse_node[0]->fwd = NULL; //尾部节点内的指针声明为NULL 70 71 free(reverse_node); 72 73 return first; 74 75 }