链表的反转操作
以一个最简单的例子来展示C语言中链表的反转操作。
首先是利用结构体功能实现链表这一种数据结构,它拥有自身的成员属性(这里以一个int型数据为例)和一个指向下一个链表节点的指针组成。注意这里typedef的使用方法,结构体内部嵌套自身的时候还不能将struct ListNode简写为ListNode。
typedef struct ListNode {
int data;
struct ListNode* next;
}ListNode;
其次是链表的创建函数, 在堆中开辟内存空间用于存贮链表节点。
ListNode* createNode(int newData)
{
ListNode* newNode=(ListNode *)malloc(sizeof(ListNode));
if (newNode == NULL)
{
printf("内存分配失败");
exit(1);
}
newNode->data = newData;
newNode->next = NULL;
return newNode;
}
再然后尝试打印链表节点中存贮的数据,新建一个临时变量,在while循环内一次打印链表内所有数据,直到当前节点的下一节点指向空指针。
void printfNode(ListNode* head)
{
ListNode* temp = head;
while (temp != NULL)
{
printf("%d ",temp->data);
temp = temp->next;
}
printf("\n");
}
反转链表的操作如注释所言。
ListNode* reserveNode(ListNode* head)
{
//声明三个局部变量,相当与空的容器
ListNode* prev = NULL;
ListNode* current = head;
ListNode* nextNode = NULL;
while (current!=NULL)
{
nextNode = current->next; //保存当前节点指向的下一节点
current->next = prev; //令当前节点指向上一个节点
prev = current;
current = nextNode;
}
return prev;
}
整体测试代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct ListNode {
int data;
struct ListNode* next;
}ListNode;
ListNode* createNode(int newData)
{
ListNode* newNode=(ListNode *)malloc(sizeof(ListNode));
if (newNode == NULL)
{
printf("内存分配失败");
exit(1);
}
newNode->data = newData;
newNode->next = NULL;
return newNode;
}
void printfNode(ListNode* head)
{
ListNode* temp = head;
while (temp != NULL)
{
printf("%d ",temp->data);
temp = temp->next;
}
printf("\n");
}
ListNode* reserveNode(ListNode* head)
{
//声明三个局部变量,相当与空的容器
ListNode* prev = NULL;
ListNode* current = head;
ListNode* nextNode = NULL;
while (current!=NULL)
{
nextNode = current->next; //保存当前节点指向的下一节点
current->next = prev; //令当前节点指向上一个节点
prev = current;
current = nextNode;
}
return prev;
}
int main()
{
ListNode* head = createNode(1);//头节点里面存储了1
head->next= createNode(2);
head->next->next = createNode(3);
head->next->next->next = createNode(4);
printf("原始链表:");
printfNode(head);
ListNode* resehead=reserveNode(head);
printf("反转链表:");
printfNode(resehead);
return 0;
}