先创建一个链表,并随机赋值
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef int ElemType;
typedef struct node {
ElemType data;
struct node * next;
} *LinkList, LNode;
void CreateListTail(LinkList * L, int n);
void listReverse(LinkList * L);
int main()
{
LinkList L;
CreateListTail(&L, 10);
LNode * p = L->next;
while (p) {
printf("%d ", p->data);
p = p->next;
}
putchar('\n');
listReverse(&L);
return 0;
}
void CreateListTail(LinkList * L, int n) {
srand(time(0));
LinkList p, r;
int i;
*L = (LNode *) malloc(sizeof(LNode));
r = *L;
for (i = 0; i < n; i++) {
p = (LinkList) malloc(sizeof(LNode));
p->data = rand() % 100 + 1;
r->next = p;
r = p;
}
r->next = NULL;
}
1. 直接值交换。
把第一个链表第一个节点的值于最后一个交换,第二个于倒数第二个交换,依次进行下去...........
void listReverse(LinkList * L) {
LinkList prev , end, t;
int i;
prev = (*L)->next;
end = (*L)->next;
for (i = 0;end != NULL;i++)
{
end = end->next;
}
for (int j = 0; j < i / 2; j++)
{
end = (*L)->next;
prev = (*L)->next;
for(int k = 1; k < (i-j);k++)
{
end = end->next;
}
for(int m = 0; m < j ;m++)
{
prev = prev->next;
}
t->data = end->data;
end->data = prev->data;
prev->data = t->data;
}
}
与数组逆置的思想差不多,但太过繁琐。
2.头插法重建链表。
将链表节点存入结构指针数组,之后用头插法重新建立链表。
void listReverse(LinkList * L)
{
LinkList b[15];
LinkList current = (*L)->next , prev;
for (int i = 0; current != NULL; i++)
{
b[i] = current;
current = current->next;
}
prev = *L;
(*L)->next = NULL;
for (int i = 0; i < 10; i++)
{
current = b[i];
current->next = prev->next;
prev->next = current;
}
}
3.交换指针
依次改变指针的指向,从而逆置链表。
void listReverse(LinkList * L)
{
LinkList current = (*L)->next, prev = NULL, next;
while(current != NULL)
{
next = current->next;
current->next = prev;
prev = current;
current = next;
}
(*L)->next = prev;
}