设计一个函数 void LinkReverse(List* pla) , 其功能将带头结点的单向链表反转。la是一个带头结点的链表,函数的目的是逆转这个链表,也就是第一个结点变成最后一个结点,第二个结点变为倒数第二个结点,以此类推。该函数的空间复杂度为O(1),也就是该函数不能定义数组变量和使用动态分配函数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
| #include <stdio.h> #include <stdlib.h>
typedef struct T_Node { int d; struct T_Node* next; } Node, * List;
void LinkReverse(List* pla) { List p, temp; p = (*pla)->next->next; (*pla)->next->next = NULL; while (p) { temp = p->next; p->next = (*pla)->next; (*pla)->next = p; p = temp; } }
void createlink(List* pla) { int i; Node* p;
*pla = (Node*)malloc(sizeof(Node)); p = *pla;
for (i = 1; i <= 10; i++) { p->next = (Node*)malloc(sizeof(Node)); p = p->next; p->d = i; p->next = NULL; } }
void main() { List la, p; int i;
createlink(&la); LinkReverse(&la);
p = la->next; for (i = 1; i <= 10; i++) { printf("%4d", p->d); p = p->next; } printf("\n"); }
|