反转链表--清晰易懂的两种方法

反转一个单链表。如下示例::
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

public class ListNode {int val;ListNode next;ListNode(int x) {val = x;}
}

一、 迭代法:

注意观察示例:1->2->3->4->5->NULL的反转可以看成:NULL<-1<-2<-3<-4<-5。

会发现链表的反转基本上就是箭头的方向的反转,即节点前驱和后继互换角色。

我们定义三个变量cur,pre和next分别表示当前节点,以及其前驱后继。cur初始化为head,其他初始化为NULL。

我们从头节点1开始遍历,1的next和pre原来分别是2和NULL(初始值)互换后1的next和pre变成NULL和2,依次这样遍历下去。

注意最后应该返回pre,不是cur。遍历结束后cur的值是NULL。
代码如下:

public ListNode reverseList(ListNode head){ListNode pre = null, cur = head, next = null;while(cur != null){next = cur.next;cur.next = pre;pre = cur;cur = next;}return pre;}

 

方法2:头插法

反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。

说明:
1 ≤ m ≤ n ≤ 链表长度。

示例:

输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL

    //头插法 每次把cur.next那个节点放在头部//m = 1, n = length的时候全部反转(直到cur.next为空)public ListNode reverseBetween(ListNode head, int m, int n) {ListNode dummy = new ListNode(0);dummy.next = head;ListNode pre = dummy;for(int i = 1;i<m;i++) pre = pre.next;//pre是要反转部分的先序节点,相当于dummyListNode cur = pre.next;for(int i = m;i<n;i++){ListNode nxt = cur.next;cur.next = cur.next.next;//pre.next = nxt;//nxt.next = cur; cur始终没变,这样写不行 会造成节点丢失nxt.next = pre.next;pre.next = nxt;}return dummy.next;}

二、递归法:
递归法和迭代法思路是一样的。
代码如下:
 

public ListNode reverseList(ListNode head){if(head == null || head.next == null){return head;}ListNode n = reverseList(head.next);head.next.next = head;//head.next是反转链表的末尾head.next = null;return n;}

只是注意两个地方:
如果head是空或者遍历到最后节点的时候,应该返回head。
代码5,6行。节点替换的时候不要用n来代替head->next;因为对于递归来说它们不是等价的。但是head->next->next 等价于 n->next。

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

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

相关文章

asp.net core 在Ubuntu 运行

asp.net core 在Ubuntu 运行 环境: Ubuntu 16.04dotnet-dev-1.0.0-preview2-003121Visual Studio 2015 update 3 Ubuntu 安装.net core 参考:https://www.microsoft.com/net/core#ubuntu 1.添加源 sudo sh -c echo "deb [archamd64] https://apt-mo.trafficmanager.net/re…

前端学习(1999)vue之电商管理系统电商系统之分析表单的数据

目录结构 router.js import Vue from vue import Router from vue-router import Login from ./components/Login.vue import Home from ./components/Home.vue import Welcome from ./components/Welcome.vue import Users from ./components/user/Users.vue import Right fr…

docker中的容器和镜像

最近学习了docker&#xff0c;感觉容器和镜像学的有点模糊。 特别是镜像和容器&#xff0c;感觉完全分不开&#xff0c;所以在此学习&#xff0c;然后总结了一下&#xff0c;便于后面的学习。 *************** 补充&#xff1a;经过我的一段时间使用&#xff0c;现在再来说一…

android studio -genymotion神奇错误

近期下载了genymotion模拟器&#xff0c;想直接在电脑上运行Android程序&#xff0c;然后出现了找不到genymotion模拟器的状况&#xff0c;解决办法&#xff1a; 1、在genymotion的setting中设置Android SDK的路径为自己下载好的SDK路径&#xff0c;而不是genymotion的SDK自动获…

二叉树三种遍历方式的非递归实现

树的递归实现方式很简单&#xff0c;下面介绍三种遍历的非递归实现。 树的遍历有个特点&#xff0c;那就是在处理具体问题时&#xff0c;绝大多数情况下是在当前循环、或函数(或是子树)的根节点来处理的&#xff0c;能够注意到当前根节点是如何从上个根节点得来是关键。 1.先…

前端学习(2000)vue之电商管理系统电商系统之绘制基本面板的结构

目录结构 router.js import Vue from vue import Router from vue-router import Login from ./components/Login.vue import Home from ./components/Home.vue import Welcome from ./components/Welcome.vue import Users from ./components/user/Users.vue import Right fr…

微服务架构与组件总览

最近在各个地方总是看到微服务、消息队列、Redis、K8s等词语&#xff0c;下面就对他们涉及的概念进行一个总体的介绍&#xff0c;具体的技术实现目前还未完全掌握&#xff0c;那就先从整体把握关系&#xff0c;更方便以后的深入学习。(参考知乎和CSDN资料) 全篇以电商服务千万…

前端学习(2001)vue之电商管理系统电商系统之获取商品分类数据

目录结构 router.js import Vue from vue import Router from vue-router import Login from ./components/Login.vue import Home from ./components/Home.vue import Welcome from ./components/Welcome.vue import Users from ./components/user/Users.vue import Right fr…

shamir门限方案阅读与密码学课程感想

这里重点谈一下对Adi Shamir的关于阈值密钥分 享方案的论文《How to Share a Secret 》的理解&#xff0c;以及这两周密码学课堂的学习感想。 想要看懂一篇论文&#xff0c;首先要知道它是为了解决什么问题&#xff0c;然后看它为了解决这个问题采用了什么样 的方法&#xff0c…

前端学习(2002)vue之电商管理系统电商系统之绘制商品分类的级联选择器

目录结构 router.js import Vue from vue import Router from vue-router import Login from ./components/Login.vue import Home from ./components/Home.vue import Welcome from ./components/Welcome.vue import Users from ./components/user/Users.vue import Right fr…

jdbc建立数据库连接的helloword

package com.guoguo.db; import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException; import com.mysql.jdbc.Connection;import com.mysql.jdbc.Statement; public class DBUtil { //数据库连接地址 private static final String URL "jdb…

前端学习(2003)vue之电商管理系统电商系统之之允许三级选择

目录结构 router.js import Vue from vue import Router from vue-router import Login from ./components/Login.vue import Home from ./components/Home.vue import Welcome from ./components/Welcome.vue import Users from ./components/user/Users.vue import Right fr…

Hadoop3 Hive Spark完整安装与实践

大数据实践 Hadoop3 Hive Spark完全安装 在下载目录下打开终端&#xff0c;移动下载好的文件到/usr/local sudo mv 文件名 /usr/local在/usr/local中解压文件 cd /usr/local sudo tar -zxvf 文件名改个名 sudo mv 文件名 简称安装一些工具 sudo apt-get update sudo apt-get in…

搭建hexo博客并部署到github上

hexo是由Node.js驱动的一款快速、简单且功能强大的博客框架&#xff0c;支持多线程&#xff0c;数百篇文章只需几秒即可生成。支持markdown编写文章&#xff0c;可以方便的生成静态网页托管在github上。 感觉不错。 前端人员都在用github分享自己的代码。所以想着用hexo部署到g…

前端学习(2004)vue之电商管理系统电商系统之阻止页签切换

目录结构 router.js import Vue from vue import Router from vue-router import Login from ./components/Login.vue import Home from ./components/Home.vue import Welcome from ./components/Welcome.vue import Users from ./components/user/Users.vue import Right fr…

XML入门

1 XML入门 1.1 引入 HTML:负责网页的结构 CSS&#xff1a;负责网页的样式&#xff08;美观&#xff09; Javascript&#xff1a;负责在浏览器端与用户进行交互。 负责静态的网页制作的语言 HTML语言特点&#xff1a; 1&#xff09;由标签组成。 <title> <p>…

动态规划之力扣股票类问题

注意&#xff1a;123和124是一个思路&#xff0c;他们和后面的两题思路不一样。123 124的思路主线是k次&#xff0c;所以对某天的股票&#xff0c;第k次买入 第k-1次卖出p(这里的max操作先省略)&#xff0c;第k次卖出第k次买入后p&#xff1b; 后两题主要是天数的关系&#x…

前端学习(2005)vue之电商管理系统电商系统之获取动态参数列表

目录结构 router.js import Vue from vue import Router from vue-router import Login from ./components/Login.vue import Home from ./components/Home.vue import Welcome from ./components/Welcome.vue import Users from ./components/user/Users.vue import Right fr…

分布式技术一周技术动态 2016.07.10

分布式系统实践 1. 剖析Elasticsearch集群&#xff1a;存储模型和读写操作 https://mp.weixin.qq.com/s?__bizMzA5NzkxMzg1Nw&mid2653159983&idx1&sna79206bac0f14d61b47620ceed6cb0da&scene0&key77421cf58af4a6535cd92e6d57c51e9de6a6de948c6455bdd581f7…

Mysql存储结构B树与B+树与索引

首先要说明的是&#xff0c;B-树和B树是指同一个结构&#xff0c;并没有所谓的B减树&#xff0c;两种树是B-树和B树。 Mysql存储结构是一个B树。 1.存储结构与索引 众所周知&#xff0c;索引是关系型数据库中给数据库表中一列或多列的值排序后的存储结构&#xff0c;它是一种…