设计一个函数 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>

/*设计一个函数
void LinkReverse(List* pla)
其功能将带头结点的单向链表反转。la是一个带头结点的链表,函数的目的是逆转这个链表,也就是第一个结点变成最后一个结点,第二个结点变为倒数第二个结点,以此类推。
该函数的空间复杂度为O(1),也就是该函数不能定义数组变量和使用动态分配函数。*/
//其中List是如下结构体:
typedef struct T_Node {//定义结构名为T_Node的结构体
int d;//定义结点数值data
struct T_Node* next;//定义指向下一个结点的指针
} Node, * List;//定义结构体变量Node,只能指向结构体(结点)的结构变量List

void LinkReverse(List* pla)//定义函数
{
List p, temp;//定义List型指针变量p,temp
p = (*pla)->next->next;//p指向链表中第二个结点
(*pla)->next->next = NULL;//将链表中第一个结点的next置空,即变成尾结点
while (p)//当p所指的结点不为空时
{
temp = p->next;//temp指向p所指结点的后一个结点,即作为中间变量存储
p->next = (*pla)->next;//将头结点后一个结点链接到p所指结点后,即将前后相邻两个结点反转
(*pla)->next = p;//将p所指结点链接到头结点之后
p = temp;//将temp所指结点赋给p,即p后移
}
}

//创建头指针为la的链表
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;
}
}

//如下的main函数执行后
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");
}
/*执行的结果为
10 9 8 7 6 5 4 3 2 1*/