(二十四) 单链表的逆置(java)
前言:单链表的逆置总是看完博客,当时懂了过一段时间就忘了,还是动手写一下加深一下印象吧。
参考博客:点击打开链接
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;}@Overridepublic 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结点指向precur.nextNode = pre;System.out.println("not ready "+ tmp);System.out.println("already "+ cur);System.out.println("---------");pre = cur;cur = tmp;}return pre;}
}
(二十四) 单链表的逆置(java)相关推荐
- 无头结点单链表的逆置_解析单链表逆置的多种方法 | 术与道的分享
单链表的逆置还是很重要的,不过第一次写逆置的时候程序就直接奔溃了,因为解决与链表相关的问题总是有大量的指针操作,而指针操作的代码总是容易出错的,因此这也就成就了单链表在面试中的地位. 1.普通循环逆置 ...
- 试写一算法,对单链表进行逆置
NOTICE: 本篇代码是按照源码的书写顺序所写,复制之后可直接运行. 环境: vscode 题目: 试写一算法,对单链表进行逆置 分析: 单链表的逆置需要设置两个指针,第一个进行遍历单链表:第二个进 ...
- C语言实现单链表的逆置
单链表的逆置是一个非常经典的问题,这里利用两个思想进行解决. 首先,我们需要看下原理图,其实两个思想都是一样的,都是使后一个的节点的 next 指针指向前一个节点,依次递推,直 ...
- 无头结点单链表的逆置_单链表的增删查 逆置 倒数第k个节点等问题
对于单链表而言,它没有双链表那么复杂,它只有头节点,尾节点,节点数据,后继指针.在下面本人实现了 单链表的 增 删 插 查 改. #include #include #include #i ...
- 无头结点单链表的逆置_第1章第2节练习题11 就地逆置单链表
## 问题描述 > 试编写在带头结点的单链表就地逆置,所谓"就地"是指辅助空间为O(1) ## 算法思想1 > 将头结点摘下,然后从第一个结点开始,依次插入到头节点的后 ...
- 逆置单链表c语言程序,(数据结构C语言版)顺序表和单链表的逆置
<(数据结构C语言版)顺序表和单链表的逆置>由会员分享,可在线阅读,更多相关<(数据结构C语言版)顺序表和单链表的逆置(7页珍藏版)>请在人人文库网上搜索. 1.实验1-1顺序 ...
- 有头结点单链表的逆置
[问题描述] 设有头结点单链表,编写算法实现单链表逆置. [输入形式] 第一行输入一个整数N: 第二行输入N个整数,以空格作为分隔,创建单链表: [输出形式] 输出逆置后的单链表,,元素之间以空格分隔 ...
- 单链表的逆置-C++实现(ok)
对于单链表的逆置有两种方法可以实现: (1)利用辅助指针 基本思想:在遍历结点过程中,设置辅助指针,用于记录先前遍历的结点.这样依次编译的过程中只需修改其后继结点的next域即可. 实现代码: [cp ...
- 头插法逆置单向链表c语言,单链表的逆置(头插法和就地逆置)
今天课间的时候偶然看到了一个面试题:单链表的逆置,看了题解感觉乖乖的,貌似和以前看的版本不搭,于是重新进行了一番探究 单链表的逆置分为两种方法:头插法和就地逆置法,这两种方法虽然都能够达到逆置的效果, ...
最新文章
- Tomcat7目录结构详解(非常详细)
- HTML去掉列表前面的符号!
- 本地tomcat的start.bat启动时访问不出现小猫图标
- 一种业界通用的响应式布局解决方法
- sap相关性不能被编译_经典综述编译丨生物硝化抑制丨NAT PLANTS:现代农业中的氮转化和生物硝化抑制作用...
- JVM学习-垃圾回收基础
- 将coco数据集格式转变成voc数据格式
- 点击调试时提示MFC不包含调试信息
- PowerDesigner设置code和name不联动的方法
- Tensorflow2.0之FGSM
- CSDN刷访问量专用博客
- 朋友圈集赞神器 | 1秒集齐300个赞,从此点赞不求人
- Pseudo Labelling
- 服务器虚拟化实验报告,服务器虚拟化Hyper-v 3.0实训培训
- 龙芯Fedora21平台制作docker镜像,并且解决vi乱码问题
- POI EXCEL修改图表
- 后端技术交流群,邀你加入
- 诺基亚Symbian算不算智能手机?
- Locating UI Elements (WebElements)摘抄整理
- Open3D RANSAC算法拟合分割多条直线