用C语言,建立一个普通的链表后通过修改指针,将链表的头尾颠倒(逆序)
#include <stdio.h>
#include<stdbool.h>
#include<stdlib.h>
#define TYPE int
typedef struct Node
{
TYPE data;
struct Node* next;
}Node;
Node* creat_node(TYPE data) //创建结点
{
Node* node = malloc(sizeof(Node));
node->data = data;
node->next =NULL;
return node;
}
typedef struct List
{
Node* head;
Node* tail;
size_t size;
}List;
//创建链表
List* creat_list(void)
{
List* list = malloc(sizeof(list));
list->head = NULL;
list->tail = NULL;
return list;
}
//头添加
void head_add_list(List* list,TYPE data)
{
Node* node = creat_node(data);
if(0==list->size)
{
list->head=node;
list->tail=node;
}
else
{
node->next=list->head;
list->head=node;
}
list->size++;
}
//遍历
void show_list(List* list)
{
for(Node* node = list->head;NULL!=node;node=node->next)
{
printf("%d ",node->data);
}
printf("\n");
};
//====================以上为建立链表及基本功能=====================//
//实现链表的逆序
void back(List* list)
{
Node* p1 = list->head;
Node* p2 = p1->next; //p2指向原本链表的头的下一个
list->tail = p1; //将原本的链表的头变为新的链表的尾
while(NULL!= p2->next) //若p2的下一个不为空
{
Node* p3 =p2 ->next; //p3指p2的下一个
p2->next =p1; //p2的下一个指向p1
p1 = p2; //p1 变为 p2
p2 = p3; //p2 变为 p3
// 交换指针
}
//当p2的下一个为空后跳出循环
p2->next = p1; //p2 的下一个指向p1
list->head = p2; //将p2变为链表的头
list->tail ->next = NULL; //链表的尾的下一个为NULL
}
int main()
{
List* list = creat_list(); //创建一个链表
for(int i=0;i<10;i++)
{
head_add_list(list,i); //为链表添加内容
}
show_list(list); //打印原链表
back(list); //倒序实现
show_list(list); //打印颠倒后的链表
}