leetcode之反转链表图文详解

206-反转链表

题目:

反转一个单链表。

示例:

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

思路:

迭代法:

新建一个链表的头部,循环遍历旧链表的结点,将其加到新链表的后面

递归法

代码:(迭代法)

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode reverseList(ListNode head) {
        ListNode new=null;//新建一个结点,依此来作为新表的尾结点
        ListNode p = head;//新建一个结点p,指向head的第一个结点
        while(!head){
            ListNode tmp = p.next;//tmp用来暂时存放p.next
            p.next=new;/*将p(旧链表的的第一个结点)指向新结点,即p成为了新链表的第一个结点;同时注意这里将p.next的值改变,所以需要上一步暂时存放剩下旧链表的第一个结点*/
            new=p;/*将新链表的头指针始终指向新链表的第一个结点*/
            p=tmp;/*将剩下的旧链表的第一个结点赋值给p*/
        }
        return new;
    }
}

(递归法):

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode reverseList(ListNode head) {
      if(head==null || head.next==null){/*递归的终止条件,返回的尾结点*/
          return head;
      }
      else{
          ListNode p = head.next;//a
          ListNode rehead = reverseList(p);//b
          p.next = head;//c
          head.next=null;//d
          return rehead;
        }
    }
}

递归法详解:(参考上代码)

次数 head p
0 1 2
1 2 3
2 3 4
3 4 5
4 5 null

上图表示的是递归次数对应的head,p值

  • 首先进if判断,不符合然后进else,执行到a处时,即表上次数为0时图示为:

  • 然后递归,在最后一层递归的时候,进终止递归判断的时候,即次数为4图示为:

然后返回head

  • 返回后次数为3,p为返回的head=5 此时的图示为:

详解次数为3的情况:

  • 执行b完时图示为:

  • 继续执行,执行完c时的图示为:

    • 继续执行,执行完d时的图示为:

      然后返回rehead

返回后的次数为2,即head为3,p为4,执行完b后的图示:

依次执行c、d等操作,等次数为0执行完d时就完成了链表的反转了:

这么看来rehead即为反转后的链表的第一个结点,至此反转结束。

原文地址:https://www.cnblogs.com/ICDAT/p/9380025.html

时间: 2024-08-29 02:46:55

leetcode之反转链表图文详解的相关文章

Monitorix监控Linux主机图文详解

Monitorix监控Linux主机图文详解 Monitorix简介 Monitorix 是一款自由开源的轻巧型系统监视工具.使用 Monitorix你可以随时掌控 CPU 负载及温度.内存占用.活动进程.磁盘使用及温度.网络设备流量.网络服务等全方位的系统信息.Monitorix 需要 Apache Web 服务器来显示这些系统信息图表.所以它特别适合在 Linux 服务器上面使用. 下面是我安装的步骤 1.安装的环境和需要的rpm包 我是在CentOS 6.4下面安装的CentOS 5可以使

使用VS2015创建和使用动态链接库-图文详解

之前看过原创一篇<VS2010 动态库开发--第一章 演练:创建和使用动态链接库 (C++)>的帖子,地址是http://blog.sina.com.cn/s/blog_6fb3686501011ymn.html,感谢原创.这里我们使用VS2015创建和使用自己的动态链接库,配以图文详解. 我们先来演示如何使用VS2015创建一个动态链接库.1.新建一个"Win32控制台应用程序","名称"为MathFuncsDll,"解决方案名称"

图文详解如何搭建Windows的Android C++开发环境

原地址:http://www.apkbus.com/android-18595-1-1.html //=====================================================================//TITLE://    图文详解如何搭建Windows的Android C++开发环境(一)//AUTHOR://    norains//DATE://    Thursday  14-April-2011//Environment://    Cygw

图文详解远程部署ASP.NET MVC 5项目

原文:图文详解远程部署ASP.NET MVC 5项目 话外篇: 由于感觉自己的机器比较慢,配置不好,所以最近想把之前的项目部署到实验室的服务器上,但是由于常不在实验室,所以在想能不能远程部署.因此今天专门研究了一下具体的过程,下面和大家分享一下.本人新手,还望大虾勿喷,有什么问题,还望高手指点. 一.本文实验环境: Windows Server 2012 R2 SQL Server 2012 Express Visual Studio 2013 项目为:ASP.NET MVC 5.0,使用的是L

LNMP编译安装之msyql安装--图文详解

LNMP编译安装之msyql安装--图文详解 1.前言 本次安装采用源码安装,主要资源包从官网下载,次要依赖则使用yum进行安装,本篇只涉及mysql的安装,msyql远程登录,不涉及mysql具体配置.该教程纯属安装,不涉及任何重要知识点,老少皆宜. 2.安装步骤 2.1.下载boost(只下载不安装) wget http://nchc.dl.sourceforge.net/project/boost/boost/1.59.0/boost_1_59_0.tar.gz 2.2.解压bosot t

LNMP编译安装之nginx安装--图文详解

LNMP编译安装之nginx安装--图文详解 1.前言 本次安装采用源码安装,主要资源包从官网下载,次要依赖则使用yum进行安装,本篇只涉及nginx的安装,不涉及nginx的配置,对应nginx如何访问php,本篇也不涉及.该教程纯属安装,不涉及任何重要知识点,老少皆宜. 2.安装步骤 nginx官网:http://nginx.org/en/download.html 2.1.下载nginx wget http://nginx.org/download/nginx-1.12.0.tar.gz

CentOS 7上安装Zabbix Server 3.0 图文详解

转载自 http://www.linuxidc.com/Linux/2016-09/135204.htm CentOS 7上安装Zabbix Server 3.0 图文详解 1.查看系统信息. cat /etc/RedHat-releaseCentOS Linux release 7.0.1406 (Core) uname -a Linux VM_96_155_centos3.10.0-123.el7.x86_64 #1 SMP Mon Jun 30 12:09:22 UTC 2014 x86_

Android中Canvas绘图之Shader使用图文详解

概述 我们在用Android中的Canvas绘制各种图形时,可以通过Paint.setShader(shader)方法为画笔Paint设置shader,这样就可以绘制出多彩的图形.那么Shader是什么呢?做过GPU绘图的同学应该都知道这个词汇,Shader就是着色器的意思.我们可以这样理解,Canvas中的各种drawXXX方法定义了图形的形状,画笔中的Shader则定义了图形的着色.外观,二者结合到一起就决定了最终Canvas绘制的被色彩填充的图形的样子. 类android.graphics

asp.net 三层架构图文详解

什么是三层架构? 先说说饭店中的三层结构 服务员:待客/提交菜单 厨 师:取材/炒菜/交菜 采购员:采购 三层结构分析 (1)表示层 为用户提供交互式操作界面. (2)业务逻辑层 负责关键业务的处理,负责与表示层和数据访问层的数据传递. (3)数据访问层 实现对数据的保存和读取操作. 三层结构各层间的依整关系 -----高层依赖低层 三层结构各层间的数据传递关系 ---高层请求低层.低层响应高层 三层结构搭建方法 1.搭建表示层(创建一个Windows应用程序) 2.搭建业务逻辑层(类库) 3.