c语言双链表排序交换节点_图解:单链表翻转的三种方式!

bb8b5f38ad1bff610fdc73c6e4ed7ab4.png

当我们在聊到链表反转的时候,一定说的都是单链表,双链表本身就具有前驱指针 Prev 和后续指针 next,无需进行翻转。

单链表反转,反转后的效果如下:

ae90db50fcec8b03e4a6489abd8c1e79.png

看起来很简单,只需要将单链表所有结点的 next 指向,指向它的前驱节点即可。引入一个栈结构,就可以实现。

栈实现的链表反转

在原本链表的数据结构之外,引入一个栈(数组也可),将单链表循环遍历,将所有结点入栈,最后再从栈中循环出栈,继续出栈的顺序,得到的就是反转后的单链表。

439a7c2c179ab0ea40a56df7831edbcc.png

但是这样实现,有一个问题,它会额外消耗一个栈的内存空间,此时空间复杂度就变成了 O(n)。并且,栈会遇到的问题,使用此种方式都会遇到,例如栈的深度问题。

空间复杂度为 O(1) 单链表反转

在排序算法中,有一个概念叫原地排序,指的是不需要引入额外的存储空间,在原数据结构的基础上进行排序。这种排序算法的空间复杂度是 O(1)。例如我们常见的冒泡排序、插入排序都是原地排序算法。

这里,我们也可以在原单链表的数据结构上,进行单链表反转。

原地单链表反转,是一种很基础的算法,但是有一些在面试中遇到这道题,思路不清晰时,一时半会也写不出来。

容易出错的点在于,指针丢失。在转换结点指针的时候,所需结点和指针反转顺序,都很重要,一不小心,就会丢掉原本的后续指针 next,导致链表断裂。

9f7f76f57a635ce49f9ccd1e649e9516.png

在上一篇文章中,带单链表时间复杂度为 O(1) 的结点删除法中,介绍到,删除单链表的时候,需要知道前后三个结点。在单链表翻转的时候,也是这样。

当我们要对一个结点进行指针翻转的时候,我们也需要知道三个结点。

  • 待翻转的结点。
  • 待反转结点的前驱结点 prev。
  • 待反转结点的后续结点 next。

说了那么多,直接上代码。

static class Node { int data; Node next; Node(int data){ this.data = data; }}static Node reverseByLoop(Node head) { if (head == null || head.next == null){ return head; } Node preNode = null; Node nextNode = null; while (head != null){ nextNode = head.next; head.next = preNode; preNode = head; head = nextNode; } return preNode;}

链表翻转的所有逻辑,都在 reverseByLoop() 方法中,此处以头结点为参数,反转之后返回值为反转后的单链表头结点。

有兴趣最好自己在 IDE 里敲一遍,加深印象。

递归实现单链表翻转

单链表翻转,还可以通过递归来实现,但是这里不推荐使用,大家了解一下就好了。

递归还是在借助函数调用栈的思想,其实本质上也是一个栈。没什么好说的,直接上代码。

static Node reverseByRecursion(Node head){ if(head == null || head.next == null){ return head; } Node newHead = reverseByRecursion(head.next); head.next.next = head; head.next = null; return newHead;}

小结时刻

到这里,单链表反转的内容,都介绍完了,学算法还是要考虑多写多练,推荐大家在 IDE 中,自己手动敲一遍,加深印象。

本文对你有帮助吗?留言、点赞、转发是最大的支持,谢谢!


在头条号私信我。我会送你一些我整理的学习资料,包含:Android反编译、算法、设计模式、虚拟机、Linux、Kotlin、Python、爬虫、Web项目源码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/500981.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

wsdl文档中的soap:address的生成规则_BAT大牛都在使用的数据库文档生成插件,不来看一下?...

一、概述在企业级开发中、我们经常会有编写数据库表结构文档的时间付出,从业以来,待过几家企业,关于数据库表结构文档状态:要么没有、要么有、但都是手写、后期运维开发,需要手动进行维护到文档中,很是繁琐…

修订模式怎么彻底关闭_电脑玩游戏卡顿怎么办?

电脑玩游戏卡怎么办?在玩游戏时电脑卡真的是会气死人的,特别是在打团的时候卡了,想砸电脑有木有?那么电脑玩游戏卡怎么办呢?给大家介绍几个方法,可以尝试改善卡顿。软件方面:1、 开启电源性能模…

datepicker不能选择是为什么_为什么客厅不好看?休闲椅选错了

为什么客厅不好看?休闲椅选错了很多装修完毕的小伙伴们经常有这样一个疑问: 为什么我家的客厅看上去这么凌乱,一点都没有想象中井然有致?这其中的潜在原因有很多,比如沙发墙的装饰设计有误,比如各类家具的款式搭配不对…

如何打开屏幕坏的手机_每天打开手机屏幕20次?打开10次以上的朋友进~

现代社会最很普遍的现象就是不管有没有事,不断地打开手机屏幕看时间或者刷各种信息和段子。 一块小小的屏幕却有着巨大的魅力。明明没有任何事情要干,却还是忍不住诱惑(cant resist temptation [tɛmpˈteʃən])想要打开屏幕,仿佛潘多拉的盒…

mvc 两个控制器session 丢失_用纯 JavaScript 撸一个 MVC 程序

前言我想用 model-view-controller 架构模式在纯 JavaScript 中写一个简单的程序,于是我这样做了。希望它可以帮你理解 MVC,因为当你刚开始接触它时,它是一个难以理解的概念。我做了这个todo应用程序,这是一个简单小巧的浏览器应用…

redis线程阻塞原因排插_每次面试都要被问:为什么采用单线程的Redis也会如此之快?...

众所周知,Redis在内存库数据库领域非常地火热,它极高的性能和丰富的数据结构为我们的开发提供了极大的便利。但我们也听说了,Redis是单线程的,为什么采用单线程的Redis也会如此之快呢?这篇文章我们来分析一下其中的缘由…

审计日志_Oracle审计日志过大?如何清理及关闭审计机制?

概述oracle 11g推出了审计功能,但这个功能会针对很多操作都产生审计文件.aud,日积月累下来这些文件也很多,默认情况下,系统为了节省资源,减少I/0操作,其审计功能是关闭的。这段时间发现审计占了比较多空间&…

servlet如何使用session把用户的手机号修改_SpringBoot源码学习系列之嵌入式Servlet容器...

1、前言简单介绍SpringBoot的自动配置就是SpringBoot的精髓所在;对于SpringBoot项目是不需要配置Tomcat、jetty等等Servlet容器,直接启动application类既可,SpringBoot为什么能做到这么简捷?原因就是使用了内嵌的Servlet容器&…

mybatisplus新增返回主键_第17期:索引设计(主键设计)

表的主键指的针对一张表中的一列或者多列,其结果必须能标识表中每行记录的唯一性。InnoDB 表是索引组织表,主键既是数据也是索引。主键的设计原则1. 对空间占用要小上一篇我们介绍过 InnoDB 主键的存储方式,主键占用空间越小,每个…

mysql 集群与主从_Mysql集群和主从

1、Mysql cluster: share-nothing,分布式节点架构的存储方案,以便于提供容错性和高性能。需要用到mysql cluster安装包,在集群中的每一个机器上安装。有三个关键概念:Sql节点(多个),数据节点(多个),管理节点(一个)&…

redis缓存原理与实现_基于Redis实现范围查询的IP库缓存设计方案

点击上方“码农沉思录” 发现更多精彩我先说下结果。我现在还不敢放线上去测,这是本地测的数据,我4g内存的电脑本地开redis,一次都没写完过全部数据,都是写一半后不是redis挂就是测试程序挂。可以肯定的是总记录数是以千万为单位…

mysql原生库_Mysql数据库的一些简单原生sql语句

原生sql语句查询:select * from 表名 :查找表内所有数据, * 代表所有where 具体条件 :where作位查询sql语句条件,例 select * from 表名 where 字段名指定值order by 升降序:与desc和asc使用,通常以int类型字段进行升…

有向图生成树是如何画的_漫画:什么是最小生成树?

作者 | 小灰来源 | 程序员小灰————— 第二天 —————————————————首先看看第一个例子,有下面这样一个带权图:它的最小生成树是什么样子呢?下图绿色加粗的边可以把所有顶点连接起来,又保证了边的权值之和最小&a…

printf 指针地址_c语言对指针的理解

先来讲一下本人学指针的经历:大一的时候刚接触c语言对指针这东西真的是太迷了,感觉麻烦难懂不想其他语言一样。但是搞懂以后就被指针的魅力吸引甚至喜欢上c语言。不多讲,开始!(文章可能有些长,但放心全是基础的东西&am…

python 时分秒毫秒_python将时分秒转换成秒的实例

处理数据的时候遇到一个问题,从数据库里导出的数据是时分秒的格式:hh:mm:ss ,现在我需要把它转换成秒,方便计算。原数据可能分两种情况,字段有可能是文本字符串类型的,也有可能是时间类型,他们的…

信息系统项目管理师论文优秀范文_软考 信息系统项目管理师备考指南

1.考试简介信息系统项目管理师考试作为全国计算机技术与软件专业技术资格(水平)考试(一般简称为“软考”)的一个高级级别,是从2005年开始的,一共考了2次,即2005年5月,200…

单片机led闪烁代码_单片机驱动LED发光二极管的电路以及编程

一、单片机驱动单个发光二极管1.电路代码:1.点亮单个LED二极管#include《reg51.h> sbit LED1P1^0&#xff1b;void main(void){LED11&#xff1b;while(1)&#xff1b;{LED10} }2.单个LED数码管以固定频率闪烁#include<reg51.h> sbit LED1P1^0;void Delay(unsigned in…

macos系统自动安装mysql_macos系统安装mysql

MacOS系统安装mysql一、下载官网下载链接地址&#xff1a;https://dev.mysql.com/downloads/mysql/二、安装打开文件是pkg包&#xff0c;双击进行安装&#xff1a;按照提示&#xff1a;点击最下面的MySQL控制按钮&#xff0c;启动数据库运行&#xff1a;在此可以启动和停止MySQ…

水晶报表中对某一栏位值进行处理_合并报表——非同一控制下的企业合并amp;同一控制下的企业合并...

【写在前面】长期股权投资企业的一种投资行为&#xff0c;投资方通过该行为享有被投资单位的股利分配、净利润等投资收益&#xff0c;处理的是母公司&#xff08;投资方&#xff09;的个别财务报表。只有控股合并才需要编制合并报表&#xff0c;意味着后续计量采用的是成本法。…

python测试框架untest怎么循环执行_unittest如何在循环遍历一条用例时生成多个测试结果...

引用自:http://blog.csdn.net/kaku21/article/details/42124593参考网址&#xff1a;http://programmaticallyspeaking.com/test-data-provider-using-python-metaclass.html使用TestNG进行测试的时候&#xff0c;允许使用外部数据源来驱动测试方法的执行&#xff0c;举个例子&…