#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ElemType int
typedef struct Node
{
ElemType data;
struct Node* next;
} Node;
typedef struct Node* Linklist;
Linklist CreatListHead(int n); //头插法创建链表
void ShowList(Linklist head); //printf链表
Linklist ReverseList(Linklist head); //链表反转
int main()
{
Linklist list1 = CreatListHead(5);
ShowList(list1);
Linklist list2 = ReverseList(list1);
ShowList(list2);
}
Linklist CreatListHead(int n) //头插法创建链表
{
Linklist p, t;
int i;
srand((unsigned)time(0)); //根据时间初始化随机数种子
t = (Linklist)malloc(sizeof(Node));
t->next = NULL; //建立带头结点的链表
for (i = 0; i < n; i++)
{
p = (Linklist)malloc(sizeof(Node));
p->data = rand() % 100 + 1;
p->next = t->next;
t->next = p;
}
return t;
}
void ShowList(Linklist head) //printf链表
{
Linklist p = head->next;
while (p)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
Linklist ReverseList(Linklist head) //头结点链表反转
{
Linklist p1 = NULL, p2 = head->next, p3 = p2->next;
if (!p2 || !p3) return head; //如果为空链表或只有一个节点,则不需要反转
while (p3) //当p3指向NULL(链表末尾)时停止循环
{
p2->next = p1; //将后一个节点的next指向前一个节点
p1 = p2; //后移三个指针
p2 = p3;
p3 = p2->next;
}
p2->next = p1; //将最后一个节点的next指向前一个节点
head->next = p2; //将头节点的next指向最后一个节点,完成反转
return head;
}
上面是有头结点
下面是无头结点的链表反转的伪代码
Linklist ReverseList(Linklist head) //无头结点链表反转
{
Linklist p2 = head;
Linklist p1 = NULL;
Linklist p3 = NULL;
while (p2)
{
p3 = p2->next;
p2->next = p1;
p1 = p2;
p2 = p3;
}
return p1;
}