链表的反转操作

以一个最简单的例子来展示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;
}
相关推荐
難釋懷20 小时前
Redis数据结构-Set结构
数据结构·redis·bootstrap
如何原谅奋力过但无声1 天前
【灵神高频面试题合集06-08】反转链表、快慢指针(环形链表/重排链表)、前后指针(删除链表/链表去重)
数据结构·python·算法·leetcode·链表
平行侠1 天前
037插入排序 - 整理扑克牌的算法
数据结构·算法
,,?!,1 天前
数据结构算法-排序算法
数据结构·算法·排序算法
‎ദ്ദിᵔ.˛.ᵔ₎1 天前
C++哈希表
数据结构·c++·散列表
阿旭超级学得完1 天前
C++11(初始化)
java·开发语言·数据结构·c++·算法
云淡风轻~窗明几净1 天前
关于角谷猜想的五行小猜想
数据结构·算法
Languorous.1 天前
C++数据结构进阶|并查集(Union-Find)详解:从原理到面试实战
数据结构·c++·面试
Languorous.1 天前
C++数据结构进阶|堆(Heap)详解:从手写实现到面试高频实战
数据结构·c++·面试
玛卡巴卡ldf1 天前
【LeetCode 手撕算法】(栈)有效括号、最小栈、字符串解码、每日温度、柱状图最大矩形
java·数据结构·算法·leetcode·力扣