链表的反转操作

以一个最简单的例子来展示C语言中链表的反转操作。

首先是利用结构体功能实现链表这一种数据结构,它拥有自身的成员属性(这里以一个int型数据为例)和一个指向下一个链表节点的指针组成。注意这里typedef的使用方法,结构体内部嵌套自身的时候还不能将struct ListNode简写为ListNode。

cpp 复制代码
typedef struct ListNode {
	int data;
	struct ListNode* next;
}ListNode;

其次是链表的创建函数, 在堆中开辟内存空间用于存贮链表节点。

cpp 复制代码
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循环内一次打印链表内所有数据,直到当前节点的下一节点指向空指针。

cpp 复制代码
void printfNode(ListNode* head)
{
	ListNode* temp = head;
	while (temp != NULL)
	{
		printf("%d ",temp->data);
		temp = temp->next;
	}
	printf("\n");
}

反转链表的操作如注释所言。

cpp 复制代码
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;
}

整体测试代码:

cpp 复制代码
#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;
}
相关推荐
liu****17 小时前
8.list的模拟实现
linux·数据结构·c++·算法·list
武帝为此19 小时前
【B树与B+树详解】
数据结构·b树
南莺莺19 小时前
邻接矩阵的基本操作
数据结构·算法··邻接矩阵
观望过往20 小时前
【Java数据结构】队列详解与经典 OJ 题目实战
java·数据结构
aramae20 小时前
详细分析平衡树--红黑树(万字长文/图文详解)
开发语言·数据结构·c++·笔记·算法
CHEN5_0221 小时前
【leetcode100】和为k的子数组(两种解法)
java·数据结构·算法
guguhaohao1 天前
list,咕咕咕!
数据结构·c++·list
Code小翊1 天前
希尔排序基础理解
数据结构·算法·排序算法
Pluchon1 天前
硅基计划4.0 算法 二叉树深搜(DFS)
java·数据结构·算法·leetcode·深度优先·剪枝
Yupureki1 天前
从零开始的C++学习生活 9:stack_queue的入门使用和模板进阶
c语言·数据结构·c++·学习·visual studio