算法篇—反转链表

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

示例 1:

输入:head = 1,2,3,4,5

输出:5,4,3,2,1

示例 2:

输入:head = 1,2

输出:2,1

示例 3:

输入:head = \[\]

输出:\[\]

方法一:
时间复杂度O(N)
空间复杂度O(1)
解题分析:
创建3个指针,分别是L1,L2,L3。L1指向NULL,L2指向head,L3指向head->next(前提head不为NULL);将L2->next指向L1,再把L1=L2,L2=L3,依次循环,那么最后返回L1就实现了反转链表

c 复制代码
typedef struct ListNode ListNode;
struct ListNode* reverseList(struct ListNode* head)
{
		if(head==NULL)
			return NULL;//这样往后的节点至少为1个
		ListNode *L1=NULL;
		ListNode *L2=head;
		ListNode *L3=head->next;//由于if的判断,所以这里的head不可能为NULL
		while(L2)
		{
			L2->next=L1;
			L1=L2;
			L2=L3;
			if(L3!=NULL)
				L3=L3->next;//L3会先一步到达NULL,所以判断只要为NULL就不执行这一行。
		}
	return L1;

方法二:
解题分析:
头部插入,创建两个指针分别为头部指针newhead和遍历指针cur,进行遍历,将cur的每一个节点都头部插入给newhead,最后返回newhead即可

c 复制代码
typedef struct ListNode ListNode;
struct ListNode* reverseList(struct ListNode* head)
{
	if(head==NULL)
		return NULL;
	ListNode *newhead=NULL;
	ListNode *cur=head;
	ListNode *next=cur->next;
	while(cur)
	{
		if(newhead==NULL)
		{
			newhead=cur;
			newhead->next=NULL;
		}
		else
		{
			cur->next=newhead;
			newhead=cur;
		}
		cur=next;
		if(next!=NULL)
				next=next->next;
	}
	return newhead;
相关推荐
djarmy7 小时前
MAIN.c(1): warning C318: can’t open file ‘STC8G.H’ 报错 解决 分析
c语言·开发语言·mongodb
李永奉8 小时前
中科蓝讯SDK开发-BT893x 面条耳机连接vivo手机后连接APP端,最后手机端设置页面手动断开蓝牙连接,此时耳机端假断开
c语言·开发语言·嵌入式硬件·物联网·智能手机·电脑
2601_967760788 小时前
2026年PDF压缩与页码添加工具技术实测:性能、算法与本地化适配深度对比
算法·pdf
不会就选b9 小时前
算法日常・每日刷题--<贪心>7
数据结构·算法·leetcode
moonrailgun9 小时前
用 Node.js 复刻 Codex Astra 的终端星光
前端·javascript·算法
罗西的思考10 小时前
[Agent Memory / 强化学习] MemPO源码学习笔记 ---(1)--- 总体
人工智能·算法·机器学习
lvwangshu11 小时前
图论:LCA、树的直径、树的重心、二分图与 Tarjan 缩点
算法·图论
爱吃苹果的日记本11 小时前
数据结构第一课
c语言·数据结构·数据库·学习·c#
张小姐的猫11 小时前
【AI大模型接入SDK】 —— Gemini接入封装
android·数据结构·数据库·c++·人工智能·python
302wanger11 小时前
干与湿:AI 拿走脑力之后,人剩下什么
算法