java 链表逆序 递归,java用递归和非递归实现链表逆序
传统的逆序链表方法是使用三个指针来记录节点的状态,防止链表断裂。
Node节点
public class Node {
private int data;
private Node next;
public Node(int data){
this.data = data;
next = null;
}
public int getData() {
return this.data;
}
public void setData(int data) {
this.data = data;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
}
逆序方法
public static Node reverseLinkList(Node head){
Node p1=head,p2 = head.getNext();
Node p3=null;
while (p2!=null){
p3 = p2.getNext();
p2.setNext(p1);
p1 = p2;
p2 = p3;
}
return p1;
}
主方法里面逆序
Node newHead = reverseLinkList(head);
head.setNext(null);
p = newHead;
while (p != null) {
System.out.print(p.getData() + " ");
p = p.getNext();
}
我在想递归是先处理好后面的问题,然后把结果返回。如果我从最后开始逆序整个链表,我获得当前节点的后一个节点的时候,当前节点的后面已经完成逆序。只要将后一个节点指向当前节点。
这里使用了静态变量newHead是因为要记录旧的尾节点来作为新的头节点。不然整个函数获得的只是旧的头结点(新的尾节点)。如果将newHead作为形参传入方法,而不设置成静态变量,是不行的。因为java里面对象的引用形参相当于拷贝了一份实参。直接改变形参指向一个新的对象是不会改变实参的。而改变形参引用的内容却可以改变实参所引用对象的内容,如下面的setNext方法。
private static Node newHead;
public static Node getNextNode(Node node) {
if (node.getNext() != null) {
//获得后一个节点,此时该节点后面节点已经全部逆序完
Node nextNode = getNextNode(node.getNext());
nextNode.setNext(node);
return node;
}
//最后一个节点
else {
newHead = node;
return node;
}
}
主方法里面调用,可以发现递归来实现逆序也是可以的
Node tail = getNextNode(head);
//尾节点(原头节点)指向null
tail.setNext(null);
p = newHead;
while (p != null) {
System.out.print(p.getData() + " ");
p = p.getNext();
}
java 链表逆序 递归,java用递归和非递归实现链表逆序相关推荐
- 非递归前序遍历二叉树,非递归中序遍历二叉树,非递归后续遍历二叉树
import java.util.Stack;public class Front {//非递归前序遍历public void front(TreeNode node) {Stack<TreeN ...
- mysql 实现非递归树_二叉树的非递归前序,中序,后序遍历算法
#include #include struct tree { char data; struct tree *lchild; struct tree *rchild; }; typedef stru ...
- python非递归前序遍历二叉树_Python非递归实现二叉树的后续遍历
leetcode 145. Binary Tree Postorder Traversal 思路一: 使用一个栈stack保存经过的根结点,另一个栈flag保存每个结点的右子树是否遍历: 如果根结点存 ...
- 递归:我不用栈 非递归:栈使我快乐
偶尔敲代码,今天看树的遍历方式递归和非递归方式实现,碰到了一个关于栈的问题. 栈 栈的定义:栈是限定仅在表头进行插入和删除操作的线性表.要搞清楚这个概念,首先要明白"栈"原来的意思 ...
- Java实现二叉树的创建、递归/非递归遍历
近期复习数据结构中的二叉树的相关问题,在这里整理一下 这里包含: 1.二叉树的先序创建 2.二叉树的递归先序遍历 3.二叉树的非递归先序遍历 4.二叉树的递归中序遍历 5.二叉树的非递归中序遍历 6. ...
- 完全二叉树的JAVA实现(以及非递归遍历方法)
一个用于实现初始化指定个数的完全二叉树,以及两个非递归的深度优先遍历,和广度优先遍历 package fifth; import java.util.Random; public class Tool ...
- [Java]将二叉树的左右子树交换 非递归实现
[java] view plaincopy package dataStruct; import java.util.Stack; /** * 将二叉树的左右子树交换 非递归实现 * @author ...
- 二叉树的非递归遍历(java版)
二叉树的递归遍历比较简单,这里就不聊了.今天主要聊聊二叉树的非递归遍历,主要借助于"栈"后进先出的特性来保存节点的顺序,先序遍历和中序遍历相对来说比较简单,重点理解后序遍历. 1. ...
- 实现一个二叉树层级遍历_算法总结:左神class5—二叉树递归和非递归实现遍历(后序用一个栈彩蛋)...
二叉树类型的题目为常考题型 1.能够结合队列.栈.链表.字符串等很多数据结构. 2.需要掌握图的基本遍历方式,比如BFS和DFS. 3.需要掌握递归函数的使用,并自己设计出递归过程. 4.与实际工作结 ...
- 中序建立二叉树,非递归前序遍历二叉树
内容: 编写程序,实现下述功能,并上机调试通过. 按中序顺序建立一棵二叉树: 用非递归方式遍历二叉树(先序),输出遍历序列. 步骤: 算法分析 采用二叉链表做存储结构,建立二叉树,借助于栈结构来实现二 ...
最新文章
- PE文件和COFF文件格式分析——RVA和RA相互计算
- 使用示例_使用 COMSOL 软件模拟不规则形状并构建几何模型示例
- 外卖平台降费,能否成为“全村人的希望”?
- kafka消费中的partition与消费者的关系
- Imagelist 控件
- 几台WEB经常宕机,求分析原因
- js json过滤_如何在浏览器不崩溃的情况下过滤 200 万行数据?
- 卸载mscs、活动目录、dns方法
- 自动化测试——接口测试——增删改查
- 极简代码(七)—— SNR
- graphql java sql_GraphQL标准的Java实现graphql-java概述
- 进程和线程的基本概念与区别
- 详解python多进程(含示例代码)
- Android开发好用的依赖库
- 这是一篇随笔 hello world
- 如何在Vue.js和ElementUI框架中获取Collapse组件最后选中的值
- mysql 库存超卖_mysql处理高并发,防止库存超卖
- 技术人最基本投资建议
- Matlab代码书写规范
- vue复选框选中一个全选中了
热门文章
- 细读:关于搜索引擎及其开发,我的疑问和思考
- 高并发情况处理(乐观锁悲观锁)
- php读取微信收款记录,老板们,如何快速查看微信“收款记录”?简单小技巧轻松Get!...
- Mycloud 安装 SVN 折腾笔记1
- 华东师范大学 2017年计算机专硕 考研初试经验贴 初试第一/数学满分
- SHA256withRSA密钥加签
- CoordinatorLayout+Behavior讲解
- QT笔记--QT内类的层次关系,以及控件从属关系
- STM32芯片型号的命名解读
- 多元统计分析-主成分分析的原理与实现