传统的逆序链表方法是使用三个指针来记录节点的状态,防止链表断裂。

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用递归和非递归实现链表逆序相关推荐

  1. 非递归前序遍历二叉树,非递归中序遍历二叉树,非递归后续遍历二叉树

    import java.util.Stack;public class Front {//非递归前序遍历public void front(TreeNode node) {Stack<TreeN ...

  2. mysql 实现非递归树_二叉树的非递归前序,中序,后序遍历算法

    #include #include struct tree { char data; struct tree *lchild; struct tree *rchild; }; typedef stru ...

  3. python非递归前序遍历二叉树_Python非递归实现二叉树的后续遍历

    leetcode 145. Binary Tree Postorder Traversal 思路一: 使用一个栈stack保存经过的根结点,另一个栈flag保存每个结点的右子树是否遍历: 如果根结点存 ...

  4. 递归:我不用栈 非递归:栈使我快乐

    偶尔敲代码,今天看树的遍历方式递归和非递归方式实现,碰到了一个关于栈的问题. 栈 栈的定义:栈是限定仅在表头进行插入和删除操作的线性表.要搞清楚这个概念,首先要明白"栈"原来的意思 ...

  5. Java实现二叉树的创建、递归/非递归遍历

    近期复习数据结构中的二叉树的相关问题,在这里整理一下 这里包含: 1.二叉树的先序创建 2.二叉树的递归先序遍历 3.二叉树的非递归先序遍历 4.二叉树的递归中序遍历 5.二叉树的非递归中序遍历 6. ...

  6. 完全二叉树的JAVA实现(以及非递归遍历方法)

    一个用于实现初始化指定个数的完全二叉树,以及两个非递归的深度优先遍历,和广度优先遍历 package fifth; import java.util.Random; public class Tool ...

  7. [Java]将二叉树的左右子树交换 非递归实现

    [java] view plaincopy package dataStruct; import java.util.Stack; /** * 将二叉树的左右子树交换 非递归实现 * @author  ...

  8. 二叉树的非递归遍历(java版)

    二叉树的递归遍历比较简单,这里就不聊了.今天主要聊聊二叉树的非递归遍历,主要借助于"栈"后进先出的特性来保存节点的顺序,先序遍历和中序遍历相对来说比较简单,重点理解后序遍历. 1. ...

  9. 实现一个二叉树层级遍历_算法总结:左神class5—二叉树递归和非递归实现遍历(后序用一个栈彩蛋)...

    二叉树类型的题目为常考题型 1.能够结合队列.栈.链表.字符串等很多数据结构. 2.需要掌握图的基本遍历方式,比如BFS和DFS. 3.需要掌握递归函数的使用,并自己设计出递归过程. 4.与实际工作结 ...

  10. 中序建立二叉树,非递归前序遍历二叉树

    内容: 编写程序,实现下述功能,并上机调试通过. 按中序顺序建立一棵二叉树: 用非递归方式遍历二叉树(先序),输出遍历序列. 步骤: 算法分析 采用二叉链表做存储结构,建立二叉树,借助于栈结构来实现二 ...

最新文章

  1. PE文件和COFF文件格式分析——RVA和RA相互计算
  2. 使用示例_使用 COMSOL 软件模拟不规则形状并构建几何模型示例
  3. 外卖平台降费,能否成为“全村人的希望”?
  4. kafka消费中的partition与消费者的关系
  5. Imagelist 控件
  6. 几台WEB经常宕机,求分析原因
  7. js json过滤_如何在浏览器不崩溃的情况下过滤 200 万行数据?
  8. 卸载mscs、活动目录、dns方法
  9. 自动化测试——接口测试——增删改查
  10. 极简代码(七)—— SNR
  11. graphql java sql_GraphQL标准的Java实现graphql-java概述
  12. 进程和线程的基本概念与区别
  13. 详解python多进程(含示例代码)
  14. Android开发好用的依赖库
  15. 这是一篇随笔 hello world
  16. 如何在Vue.js和ElementUI框架中获取Collapse组件最后选中的值
  17. mysql 库存超卖_mysql处理高并发,防止库存超卖
  18. 技术人最基本投资建议
  19. Matlab代码书写规范
  20. vue复选框选中一个全选中了

热门文章

  1. 细读:关于搜索引擎及其开发,我的疑问和思考
  2. 高并发情况处理(乐观锁悲观锁)
  3. php读取微信收款记录,老板们,如何快速查看微信“收款记录”?简单小技巧轻松Get!...
  4. Mycloud 安装 SVN 折腾笔记1
  5. 华东师范大学 2017年计算机专硕 考研初试经验贴 初试第一/数学满分
  6. SHA256withRSA密钥加签
  7. CoordinatorLayout+Behavior讲解
  8. QT笔记--QT内类的层次关系,以及控件从属关系
  9. STM32芯片型号的命名解读
  10. 多元统计分析-主成分分析的原理与实现