定义一个Node节点类

 1 public class Node {
2 public int value;
3 public Node next;
4
5 public Node(int value) {
6 this.value = value;
7 }
8
9 @Override
10 public String toString() {//重写toString方法,方便打印节点
11 return value+"";
12 }
13 }

循环迭代

 1 public static Node reverseList1(Node head){
2 Node pre = null;
3 Node next = null;
4 while(head!=null){
5 next = head.next;//记录当前节点的下一个节点,防止断链
6 head.next = pre;//指针反转
7 //光标移向下一个节点
8 pre = head;
9 head = next;
10 }
11 return pre;
12 }

假设创建如下4个节点,并调用reverseList1

  1 public static void main(String[] args){
2 Node n1 = new Node(1);
3 Node n2 = new Node(2);
4 Node n3 = new Node(3);
5 Node n4 = new Node(4);
6 n1.next = n2;
7 n2.next = n3;
8 n3.next = n4;
9 System.out.println(reverseList1(n1));
10 }

之后重复循环直至head==null退出循环

程序执行结果如下


递归

  • 递归的思想是head.next.next=head,以此类推;
  • 实现的关键是找到临界点(递推头:何时退出递归),当head.next==null时,说明已经递归到最后一个节点了,此时不再递归调用
  1 public static Node reverseList2(Node head){
2 if(head==null||head.next==null){//递归头
3 return head;
4 }else{
5 Node reversed = reverseList2(head.next);//调用自身方法
6 //递归体
7 head.next.next = head;
8 head.next = null;
9 return reversed;
10 }
11 }

假设创建如下4个节点,并调用reverseList2

 public static void main(String[] args){
Node n1 = new Node(1);
Node n2 = new Node(2);
Node n3 = new Node(3);
Node n4 = new Node(4);
n1.next = n2;
n2.next = n3;
n3.next = n4;
System.out.println(reverseList1(n1));
}

递归追踪

reverseList(n2),reverseList(n1)依次运行结束,链表反转完成,输出如下

java_链表反转的更多相关文章

  1. 链表反转leetcode206

    最近准备结束自己的科研生涯,准备要开始找工作了,准备在LEETCODE刷刷题...刷的前40题全部用python刷的,各种调包速度奇快,后被师哥告知这样没意义,于是准备开始回归C++,Python用的 ...

  2. 链表反转 (Multi-method)

    链表反转是链表相关问题最基础的知识,做完LeetCode中LinkedList后才会有这种体会,因为ACM算法中不会涉及这一部分.解决这一问题有多种方法,在面试中面试官通常也会要求写出多种.包括sta ...

  3. java实现单链表反转

    一.简介 经查阅,主要有两种方法实现链表反转,递归反转法和遍历反转法: 递归: 在反转当前结点之前先反转其后边的结点,即.从尾结点开始逆向反转各个节点的指针域指向: 遍历:从前往后反转各个结点的指针域 ...

  4. C++ 单向链表反转

    单向链表反转,一道常见的面试题,动手实现下. #include "stdafx.h" #include <stdlib.h> struct Node{ int data ...

  5. c语言:链表排序, 链表反转

    下面将实现链表排序的排序和遍历显示功能: 所定义的链表结构如下: head -> p1 -> p2 ->p3 ->....->pn; head的本身不作为数据节点,hea ...

  6. 【Java数据结构】Java数据结构之链表反转

    我们都知道用C可以很简单的实现单链表反转,今天来学习下,在Java中如何实现链表反转. 思路很简单,定义一个类,这个类分成2块,一块是表示自身的标志,另外一个存储指向下一个元素的引用.通过互换相邻两个 ...

  7. [LeetCode] 链表反转相关题目

    暂时接触到LeetCode上与链表反转相关的题目一共有3道,在这篇博文里面总结一下.首先要讲一下我一开始思考的误区:链表的反转,不是改变节点的位置,而是改变每一个节点next指针的指向. 下面直接看看 ...

  8. 单链表反转(Singly Linked Lists in Java)

    单链表反转(Singly Linked Lists in Java) 博客分类: 数据结构及算法   package dsa.linkedlist; public class Node<E> ...

  9. 【easy】206. Reverse Linked List 链表反转

    链表反转,一发成功~ /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; ...

随机推荐

  1. IDEA的常用操作(快捷键)

    IDEA的常用操作(快捷键) Alt+回车 导入包,自动修正 Ctrl+N 查找类 Ctrl+Shift+N 查找文件 Ctrl+Alt+L 格式化代码 Ctrl+Alt+O 优化导入的类和包 Alt ...

  2. phpmyadmin 打开数据表较多,数据量较大的数据库时出现超时的解决办法

    用phpmyadmin打开数据表较多,数据量较大的数据库时,会出现超时,或者等半天打开了说数据库没有表.并且即便打开了,再进行其他浏览,编辑,sql等操作,页面也是相当慢的,慢等几乎无法忍受.这里慢也 ...

  3. python :编写装饰器

    简单装饰器 def log_time(func): # 此函数的作用时接受被修饰的函数的引用test,然后被内部函数使用 def make_decorater(): print('现在开始装饰') f ...

  4. C语言文件操作类型速查

    文件使用方式 含义 "r"(只读) 为输入打开一个文本文件,不存在则失败 "w"(只写) 为输出打开一个文本文件,不存在则新建,存在则删除后再新建 " ...

  5. Spring 注解中@Resource 和 @Authwired 的区别

    @Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了.@Resource有两个属性是比较重要的,分 ...

  6. HTML第一章:初始HTML

    设置ws字体大小:左上角file-->Settings--->在搜索框中输入font 网页的第一行一定是<!DOCTYPE html>:网页声明,代表这个页面是h5页面html ...

  7. JAVAWEB开发中过滤器的概述及使用

    1.什么是过滤器? 过滤器是向WEB应用程序的请求和响应添加功能的WEB服务组件 2.过滤器的作用 1)可以统一的集中处理请求和响应 2)可以实现对请求数据的过滤 3.过滤器的工作方式 4.使用场合 ...

  8. SqlServer 连接GreenPlum问题处理

    一.SQL SERVER.GREENPLUM 1. SSIS安装 ▶ 安装SQL SERVER 2005 数据库之后,运行SSIS工具,建立包,建立完成之后,新建工作流,双击工作流之后无法进行编辑,并 ...

  9. 破解weblogic(数据库)密码

    破解weblogic(数据库)密码所需步骤 注意:本例子本人以本地weblogic为列,必须已经安装weblogic 1.需要问题件 1>.数据源配置文件HKS***-****-jdbc.xml ...

  10. mysql5.6 配置 文件

    mysql 3306 主库配置文件 [client] port = 3306 default-character-set=utf8mb4 socket = /ssd/mysql/3306/tmp/my ...