反转一个单链表。如下示例::
输入: 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。

反转链表--清晰易懂的两种方法相关推荐

  1. JAVA——反转的两种方法

    package Array;// 反转,用for的两种方法 public class Array_Demo {public static int[] Reverse(int[] ints){int[] ...

  2. 将单链表翻转的两种方法

    单链表翻转很容易理解,例如: 输入: NODE1->NODE2->NODE3->NODE4->NODE5->NULL 输出: NODE5->NODE4->NO ...

  3. (不带头结点的)单链表增删查改,逆置单链表(两种方法),求两个单链表的第一个公共结点,合并两个单链表,单循环链表中判断第一个入环点,约瑟夫环

    补充了每个算法的基本思想,并且画了思路图,源代码都经过调试成功 1.SlistNode.c文件 (1) (不带头结点的)单链表增删查改 #include "SlistNode.h" ...

  4. 004 两种方法找寻路call

    文章目录 关于寻路call 通过参数找寻路call CE搜索寻路目的地坐标 通过参数定位寻路call 寻路call参数分析 寻路call代码测试 寻路状态找寻路call 搜索寻路标志位 通过寻路标志位 ...

  5. 【剑指offer 07】用迭代和递归两种方法重构二叉树(python实现)

    本文讲解一个经典的面试题,使用 python 通过迭代和递归两种方法重构二叉树. 题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字 ...

  6. Django 后台admin管理页面添加简易导出/下载数据功能的两种方法

    在Django中有时候需要在后台界面需要用到导出数据的功能,对于功能要求比较高的可以直接使用Import_Export库来完成.但是对于一些简单的数据导出,可以直接自定义一些简单的函数来实现导出数据. ...

  7. 命名实体识别python_命名实体识别的两种方法

    作者 | Walker [磐创AI导读]:本文主要介绍自然语言处理中的经典问题--命名实体识别的两种方法. 目录 一.什么是命名实体识别 二.基于NLTK的命名实体识别 三.基于Stanford的NE ...

  8. jpg格式电脑怎么弄_电脑上怎么压缩JPG图片?两种方法帮你轻松解决

    我们在工作中经常会使用到各种图片,尤其做PPT时,需要大量的图片素材.为了方便保存与传输图片,首先我们要进行图片压缩,但在压缩时很容易导致图片质量受损.今天小编向大家分享两种图片压缩的方法,帮助大家在 ...

  9. java遍历文件和归类_java读取文件的两种方法:java.io和java.lang.ClassLoader

    java读取文件的两种方法:java.io和java.lang.ClassLoader 什么时候使用java.io,什么时候使用java.lang.ClassLoader呢? (注:要是之前读xml文 ...

最新文章

  1. 2021-2027年中国室内定位市场研究及前瞻分析报告
  2. datazen Active Directory AD 配置
  3. 工信部:2019年全国继续加大网络提速降费力度
  4. mysql重装_连我mysql读你文件
  5. mybaits 返回ListString
  6. SLAM--各种开源项目
  7. oracle roseha 配置,RoseHA 9.0 for Windows配合Oracle11g配置文档_v2.0-2015-04.pdf
  8. 【NLP】计算所汉语词性标记集
  9. 华为畅享8plus停产了吗_华为畅享8和Plus哪个好? 华为畅享8 Plus与畅享8区别对比评测...
  10. Android 实现图文混排
  11. app抓包于appium爬取数据
  12. delphi 讲的比较详细的多线程(推荐)
  13. 【网络篇】TCP SYN Flood Attack(洪水攻击)
  14. 防止网络钓鱼攻击的10种方法...
  15. 分享一下我用Python接单的个人经历
  16. 2计算机电源机,有人说电脑主机电源功率越大越好,2个知识告诉你这观点是片面的...
  17. muse-ui.css_Muse UI:适用于Vuejs 2.0的Material Design UI库
  18. 项目商业模式的设计与思考
  19. 电工搜题软件哪个好用?试题难不难?
  20. 软件测试十八阶段(linux操作系统)

热门文章

  1. 前端学习(1812):前端调试之shadow练习
  2. 前端学习(1687):前端系列javascript基础面试前言
  3. 前端学习(1417):ajax实现步骤
  4. 前端学习(726):如何交换变量值
  5. 实例45:python
  6. STM32CubeMx HAL库使用硬件IIC读写AT24C02
  7. JS实现滚动监听以及滑动到顶部
  8. 打印水仙花数oracle,javaScript实现回文数、水仙花数判断和输出斐波那契数列
  9. php实时股票,php基于curl实现的股票信息查询类实例
  10. mybatis里oracle与MySQL的insert_update