(二十四) 单链表的逆置(java)_单链表的逆置java_i加加的博客-程序员秘密

技术标签: 单链表逆置  Android  

前言:单链表的逆置总是看完博客,当时懂了过一段时间就忘了,还是动手写一下加深一下印象吧。


参考博客:点击打开链接


demo地址:我的github


1. 单链表

先写一个简单的单链表,改写一下它的toString方法,打印出以该Node为head的单链表,方便调试。
package com.example.demo_24_chain_reversed;

public class Node {
    public int value;
    public Node nextNode;
    public Node(int value) {
        this.value = value;
    }

    @Override
    public String toString() {
        return this.value + "-->" + (nextNode != null ? nextNode.toString() : "null");
    }
}

2.单链表的递归逆置

先看下效果:


用专业的话来说就是:递归方法用的是栈的思想,先把头结点入栈,接着头结点的下一个结点入栈,直到尾结点位置,

接着依次把栈内的元素出栈,并更换其下一个结点对应的对象:


我个人理解就是一个单链表的逆置总是可以分解成一个head和它nextNode的逆置,只要head的nextNode逆置好了,然后再添上head就好了,这就用到了递归。上面我打印出的log也可以看出来。


3. 单链表的非递归逆置

非递归的方法其实就是顺着头结点往尾结点便利,遍历期间把每个结点的nextNode替换掉,
替换过程需要注意临时存储下一个节点


4.demo源码

package com.example.demo_24_chain_reversed;

public class MyClass {
    public static void main(String[] args){
        Node a = new Node(1);
        Node b = new Node(2);
        Node c = new Node(3);
        Node d = new Node(4);
        a.nextNode = b;
        b.nextNode = c;
        c.nextNode = d;
        //reverseChainRecursive(a);
        reverseChainNotRecursive(a);
    }

    private static Node reverseChainRecursive(Node head){
        System.out.println("before "+ head);
        if(head == null || head.nextNode == null){
            System.out.println("after " + head);
            return head;
        }
        Node headOfReverseChain = reverseChainRecursive(head.nextNode);
        head.nextNode.nextNode = head;
        head.nextNode = null;
        System.out.println("after "+ headOfReverseChain);
        return headOfReverseChain;
    }

    private static Node reverseChainNotRecursive(Node head) {
        Node pre = head;
        Node cur = head.nextNode;
        Node tmp;
        // 头结点的nextNode应该要置空
        pre.nextNode = null;
        while (cur != null) {
            // 先存放nex结点
            tmp = cur.nextNode;
            // 修改next结点指向pre
            cur.nextNode = pre;
            System.out.println("not ready "+ tmp);
            System.out.println("already "+ cur);
            System.out.println("---------");
            pre = cur;
            cur = tmp;
        }
        return pre;
    }
}


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/sinat_20059415/article/details/79838961

智能推荐

Qt音视频开发08-ffmpeg内核优化(极速打开/超时回调/实时响应)_ffmpeg优化_feiyangqingyun的博客-程序员秘密

最初编写这套视频解析组件的时候,面对的场景是视频监控行业,对应设备都是网络监控摄像机,传过来的都是rtsp这种视频流,做过这一块的人都知道,打开某个视频流默认耗时比较大,基本上在2s左右,那是因为ffmpeg接口内部读取的最大数据量 formatCtx->probesize(从源文件中读取的最大字节数)值是5000000,导致这里卡很久最耗时,可以调小来加快打开速度。

数据库系统概述(Data Model、DBMS、DBS、RDBS、Structured Query Language)_weixin_30262255的博客-程序员秘密

数据Data描述事物的符号记录成为数据.数据是数据库中存储的基本对象. 除了基本的数字之外、像图书的名称、价格、作者都可以称为数据.将多种数据记录列成一张表.通过数据表管理数据.每一行的数据成为记录(recorder),每一列的内容叫做字段(列field)每一列都有自己的数据类型.数据库Database...

使用python客户端上传文件到fastdfs分布式文件存储系统_python将语音文件存到fdfs_专职的博客-程序员秘密

1. 进入Python虚拟环境:workon django_py32.进入fdfs_client-py-master.zip所在目录3.pip install fdfs_client-py-master.zip第3步如果报错:fdfs_client/sendfilemodule.c:43:20: fatal error: Python.h: 没有那个文件或目录, error: command 'x86_64-linux-gnu-gcc' failed with exit stat...

基于Guava的RateLimiter设计常用接口限流功能_ratelimiter配合concurrenthashmap对用户进行简单限流_帅骚贯彻一生的博客-程序员秘密

Guava是一组核心库,包括新的集合类型(例如multimap和multiset),不可变集合,图形库,函数类型,内存缓存以及用于并发,I / O,散列,基元的API /实用程序,反射,字符串处理等等!本示例只使用了Guava工具包的RateLimiter类,进行API的限流。限流简介:限流中的“流”字该如何解读呢?要限制的指标到底是什么?不同的场景对“流”的定义也是不同的,可以是网络流量,...

strtol strtoll strtoul strtoull应用_HelloEarth_的博客-程序员秘密

在项目开发时,字符串跟整形的转换是普遍需求的一个功能,在c/c++中常用的几个函数包括strtol strtoll strtoul strtoull。目前我们的项目里面进行转换的时候都是直接调用,对被转换的字符串是否有效,转换是否成功都没有一个基本的判断,一直想研究下,今天正好有空,仔细看了下linux man page中这几个函数的详细解释.声明#include <stdlib.h>...

随便推点

Spring框架的面向切面(AOP)原理和配置[email protected]切面(value = execution)_tywiiu的博客-程序员秘密

        以下内容整理自http://how2j.cn/k/spring/spring-aop/89.html#nowhere和http://how2j.cn/k/spring/spring-annotaion-aop/1068.html#nowhere1.Spring的AOP特性    AOP 即 Aspect Oriented Program 面向切面编程     首先,在面向切面编程的...

他 1 个月写了个操作系统,退休后去做飞行员!_军哥手记的博客-程序员秘密

见字如面,我是军哥!周末了,来看篇轻松的文章。1983 年,美国计算机协会将图灵奖授予肯·汤普森和与丹尼斯·里奇。获奖理由是:“For their development of gener...

Ubuntu Nginx安装启动_xiaochou1994的博客-程序员秘密

原文地址:http://blog.csdn.net/a19881029/article/details/51824790Linux Distribution:Ubuntu 14一,Nginx的安装首先从Nginx的官网下载最新的稳定版本1.10.1,下载地址如下http://nginx.org/en/download.html[p

FineReport层式报表解决大数据集展示问题攻略_Leo.yuan的博客-程序员秘密

本文以填报报表为例,通过分页的方式,来解决大数据集展示的问题。实现的思想就是通过在SQL里筛选部分数据库数据,以达到浏览器可以合理的展示报表页面。(数据分段,语句我这采用的是MYSQL,如果要用其他数据库,请查看FineReport帮助文档)步骤一:打开fenye.cpt文件。模板界面如下 两个ds,和一部分数据,及隐藏的一行。 隐藏一行内容如下 这里数据的功...

UVa-401-Palindromes(回文)_weixin_30521161的博客-程序员秘密

这一题的话我们可以把映像字符的内容给放入一个字符串常量里面,然后开辟一个二维的字符串常量数组,里面放置答案。对于回文实际上是很好求的,对于镜像的话,我们写一个返回char的函数,让它接收一个char。接收之后进行判断,如果它是字母的话,我们就返回它减去'A'这个字母,得到的整数下标对应的镜像字符串中的字母。如果不是,我们就返回它减去字符0,得...

解决git:'instaweb' 不是一个 git 命令。参见 'git --help'。问题_邓振宁 | NIu BaI的博客-程序员秘密

git:‘instaweb’ 不是一个 git 命令。参见 ‘git --help’。当centos输入:# git instaweb --start出现:git:‘instaweb’ 不是一个 git 命令。参见 ‘git --help’。则只需要输入:# yum install git-instaweb安装git-instaweb包即可。再重新启动# git instaweb -...

推荐文章

热门文章

相关标签