当前位置: 首页 > news >正文

链表(2)反转链表

题目描述

反转一个单链表。(题目来源)

思路一

其实,反转一个单向链表,我们可以看成是将链表中的每个结点的指向反向(即从后一个结点指向前一个结点)。

我们在考虑情况的时候,还是可以先考虑一般情况,再考虑特殊情况。

一、一般情况

我们如果直接让后一个结点指向前一个结点,那么后一个结点所指向的再后面的结点的位置就无从知晓了,因此我们定义3个指针变量:n1,n2,n3。

n1:记录指针指向将要反转的结点反转后要指向的结点。

n2:记录指针指向将要反转的结点。

n3:记录指针指向将要反转的下一个结点。

在反转时,首先让n2指向的结点指向n1指向的位置,然后让n1,n2,n3指针统一后移,准备执行下一对结点之间指向的反转。

如此进行下去,所有结点指向都将反转。

二、极端情况

1.传入的链表为空时

若为空,直接返回头指针即可。

若传入链表只有一个结点,同上。

2.反转第一个结点指针的指向

因为在我们反转的过程中就是让n2指向的结点指向n1指向的位置,所以我们只需将n1的初始值赋值为NULL即可。

3.反转最后一个结点指针的指向

此时发现了遍历链表的终止条件和需要返回的新的头指针,即当n2指针为NULL时停止遍历,并且返回n1指针指向的位置。但是,这时这三个指针统一后移时,n3指针的后移将失败,因为n3后移前指向的是NULL,所以不能执行以下这句代码。

n3 = n3 -> next;

所以后移n3指针前需判断其是否为空。

代码实现

struct ListNode {int val;struct ListNode* next;
};struct ListNode* reverseList(struct ListNode* head)
{if (head == NULL || head->next == NULL)//当链表为空或只有一个结点时,无需操作return head;//直接返回struct ListNode* n1 = NULL;//记录指针指向将要反转的结点反转后要指向的位置。struct ListNode* n2 = head;//记录指针指向将要反转的结点。struct ListNode* n3 = head->next;//记录指针指向将要反转的结点的下一个结点。while (n2)//n2为NULL时,停止遍历{n2->next = n1;//反转结点指向n1 = n2;//指针后移n2 = n3;//指针后移if (n3)//判断n3是否为NULLn3 = n3->next;//指针后移}return n1;//返回n1指针指向的位置
}

思路二

将原链表的结点,从头到尾一个个地拿下来头插到一个新链表中,这个新链表起始为一个空链表(newhead指向NULL)。

代码实现

struct ListNode {int val;struct ListNode* next;
};struct ListNode* reverseList(struct ListNode* head)
{struct ListNode* cur = head;//记录当前待头插的结点struct ListNode* newhead = NULL;//新链表初始时为空while (cur)//链表中结点头插完毕时停止循环{struct ListNode* next = cur->next;//记录下一个待头插的结点cur->next = newhead;//将结点头插至新链表newhead = cur;//新链表头指针后移cur = next;//指向下一个待头插的结点}return newhead;//返回反转后的头指针
}

相关文章:

  • 字符串匹配算法(三)Trie树算法
  • 长难句打卡5.31
  • 闽盾杯 2021 DNS协议分析
  • 初识Sass
  • openfiler安装部署-1
  • 速盾:cdn如何收费?
  • 云数融合与大数据技术在日常生活中的创新应用探索
  • 【环境栏Composer】Composer常见问题(持续更新)
  • sql server 2017 linux 高可用创建和故障转移
  • Oracle 数据库 varchar2 从 4000 扩展到 32k
  • 矩阵1-范数与二重求和的求和可交换
  • Node.js笔记(万字总结)
  • 解析前端开发中同源策略与配置代理
  • strcpy、strncpy、strcat、strncat、strcmp、strstr字符串函数的使用和模拟
  • Android更新优化 - 增量更新是如何节省用户时间和流量的
  • angular学习第一篇-----环境搭建
  • CAP理论的例子讲解
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • C学习-枚举(九)
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • es6要点
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • Git初体验
  • java概述
  • Laravel 菜鸟晋级之路
  • linux学习笔记
  • Median of Two Sorted Arrays
  • PHP面试之三:MySQL数据库
  • Python爬虫--- 1.3 BS4库的解析器
  • React中的“虫洞”——Context
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • Yeoman_Bower_Grunt
  • 分布式事物理论与实践
  • 巧用 TypeScript (一)
  • 算法---两个栈实现一个队列
  • 详解移动APP与web APP的区别
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • 由插件封装引出的一丢丢思考
  • 《天龙八部3D》Unity技术方案揭秘
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • ​Java基础复习笔记 第16章:网络编程
  • ![CDATA[ ]] 是什么东东
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #Datawhale AI夏令营第4期#AIGC文生图方向复盘
  • #stm32驱动外设模块总结w5500模块
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • (09)Hive——CTE 公共表达式
  • (2)空速传感器
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (四)c52学习之旅-流水LED灯
  • (算法二)滑动窗口
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .Net Remoting常用部署结构