Java单链表反转 Java实现单链表翻转

    【尊重原创,转载请注明出处】http://blog.csdn.net/guyuealian/article/details/51119499
(一)单链表的结点结构: 

  data域:存储数据元素信息的域称为数据域; 
    next域:存储直接后继位置的域称为指针域,它是存放结点的直接后继的地址(位置)的指针域(链域)。
    data域+ next域:组成数据ai的存储映射,称为结点
    注意:①链表通过每个结点的链域将线性表的n个结点按其逻辑顺序链接在一起的。   
          ②每个结点只有一个链域的链表称为单链表(Single Linked List)。
     所谓的链表就好像火车车厢一样,从火车头开始,每一节车厢之后都连着后一节车厢。
     要实现单链表存储,首先是创建一结点类,其Java代码如下:

class Node {private int Data;// 数据域private Node Next;// 指针域public Node(int Data) {// super();this.Data = Data;}public int getData() {return Data;}public void setData(int Data) {this.Data = Data;}public Node getNext() {return Next;}public void setNext(Node Next) {this.Next = Next;}
}

(二)实现反转的方法:
  (1)递归反转法
:在反转当前节点之前先反转后续节点。这样从头结点开始,层层深入直到尾结点才开始反转指针域的指向。简单的说就是从尾结点开始,逆向反转各个结点的指针域指向,其过程图如下所示:
   head:是前一结点的指针域(PS:前一结点的指针域指向当前结点)
   head.getNext():是当前结点的指针域(PS:当前结点的指针域指向下一结点)
   reHead:是反转后新链表的头结点(即原来单链表的尾结点)

Java代码实现:
package javatest1;
public class javatest1 {public static void main(String[] args) {Node head = new Node(0);Node node1 = new Node(1);Node node2 = new Node(2);Node node3 = new Node(3);head.setNext(node1);node1.setNext(node2);node2.setNext(node3);// 打印反转前的链表Node h = head;while (null != h) {System.out.print(h.getData() + " ");h = h.getNext();}// 调用反转方法head = Reverse1(head);System.out.println("\n**************************");// 打印反转后的结果while (null != head) {System.out.print(head.getData() + " ");head = head.getNext();}}/*** 递归,在反转当前节点之前先反转后续节点*/public static Node Reverse1(Node head) {// head看作是前一结点,head.getNext()是当前结点,reHead是反转后新链表的头结点if (head == null || head.getNext() == null) {return head;// 若为空链或者当前结点在尾结点,则直接还回}Node reHead = Reverse1(head.getNext());// 先反转后续节点head.getNext()head.getNext().setNext(head);// 将当前结点的指针域指向前一结点head.setNext(null);// 前一结点的指针域令为null;return reHead;// 反转后新链表的头结点}
}class Node {private int Data;// 数据域private Node Next;// 指针域public Node(int Data) {// super();this.Data = Data;}public int getData() {return Data;}public void setData(int Data) {this.Data = Data;}public Node getNext() {return Next;}public void setNext(Node Next) {this.Next = Next;}}

(2)遍历反转法:递归反转法是从后往前逆序反转指针域的指向,而遍历反转法是从前往后反转各个结点的指针域的指向。
   基本思路是:将当前节点cur的下一个节点 cur.getNext()缓存到temp后,然后更改当前节点指针指向上一结点pre。也就是说在反转当前结点指针指向前,先把当前结点的指针域用tmp临时保存,以便下一次使用,其过程可表示如下:
   pre:上一结点
   cur: 当前结点
   tmp: 临时结点,用于保存当前结点的指针域(即下一结点)

Java代码实现:

package javatest1;
public class JavaTest1 {public static void main(String[] args) {Node head = new Node(0);Node node1 = new Node(1);Node node2 = new Node(2);Node node3 = new Node(3);head.setNext(node1);node1.setNext(node2);node2.setNext(node3);// 打印反转前的链表Node h = head;while (null != h) {System.out.print(h.getData() + " ");h = h.getNext();}// 调用反转方法// head = reverse1(head);head = reverse2(head);System.out.println("\n**************************");// 打印反转后的结果while (null != head) {System.out.print(head.getData() + " ");head = head.getNext();}}/*** 遍历,将当前节点的下一个节点缓存后更改当前节点指针*/public static Node reverse2(Node head) {if (head == null)return head;Node pre = head;// 上一结点Node cur = head.getNext();// 当前结点Node tmp;// 临时结点,用于保存当前结点的指针域(即下一结点)while (cur != null) {// 当前结点为null,说明位于尾结点tmp = cur.getNext();cur.setNext(pre);// 反转指针域的指向// 指针往下移动pre = cur;cur = tmp;}// 最后将原链表的头节点的指针域置为null,还回新链表的头结点,即原链表的尾结点head.setNext(null);return pre;}
}class Node {private int Data;// 数据域private Node Next;// 指针域public Node(int Data) {// super();this.Data = Data;}public int getData() {return Data;}public void setData(int Data) {this.Data = Data;}public Node getNext() {return Next;}public void setNext(Node Next) {this.Next = Next;}
}
如果你觉得该帖子帮到你,还望贵人多多支持,鄙人会再接再厉,继续努力的~

Java单链表反转 详细过程相关推荐

  1. 剑指offter Java单链表反转

    应上篇文章说的做一篇单链表的反转问题.关于怎么创建单链表问题我已经写过了一篇:https://blog.csdn.net/nisemono_ct/article/details/95514797 单链 ...

  2. java 单链表反转_Java实现单链表翻转详解

    单链表翻转比如有如下链表: 需要按照C B A 输出,我们可以有好几种方法: package org.andy.test; import java.util.ArrayList; import jav ...

  3. java单链表反转(头插法)详解

    链表反转思路(简述): 链表分为单链表和双链表,细分为单向循环链表和双向循环链表.本章节主要讲述单向链表的反转.在接触到这张文章之前相信大家已经对链表(链表的组成部分)有所了解,链表内部由节点构成,每 ...

  4. Java实现单链表反转操作

    单链表是一种常见的数据结构,由一个个节点通过指针方式连接而成,每个节点由两部分组成:一是数据域,用于存储节点数据.二是指针域,用于存储下一个节点的地址.在Java中定义如下: public class ...

  5. 数据结构1:单链表反转java代码解释

    来源于尚硅谷的老师代码,只因其中有几行代码自己课上没听明白,课后自己整理了一下 首先完整代码如下: //将单链表反转 public static void reversetList(HeroNode ...

  6. java数据结构 - 单链表(腾讯面试题实现单链表反转)

    直接上实现代码 //单链表的反转public static void reverseList(HeroNode head){//如果当前链表为空,或只有一个节点,无需反转if (head.next = ...

  7. java 反转jia链表_Java实现单链表反转

    本文主要介绍单链表反转的两种方法,记录如下: 1. package com.leetcode; public class ListReverse { public static void main(S ...

  8. 单链表反转的原理和python代码实现

    链表是一种基础的数据结构,也是算法学习的重中之重.其中单链表反转是一个经常会被考察到的知识点. 单链表反转是将一个给定顺序的单链表通过算法转为逆序排列,尽管听起来很简单,但要通过算法实现也并不是非常容 ...

  9. 【编程2】单链表+单链表反转(LeetCode. 206)

    文章目录 一.链表 二.单链表 1.基本概念 (1)单链表 (2)头指针--必有元素 (3)头结点--非必需元素 (4)尾结点 2.查找操作 3.插入操作 4.删除操作 三.设计思想-- 时间 < ...

最新文章

  1. 关于Combobox的多选和单选情况
  2. 消费金融首推即时沟通工具“马上”探索科技金融发展新方向
  3. node更新到最新版本_win10怎么更新flash到最新版本「系统天地」
  4. 【直播 】ASP.NET Core解密底层设计逻辑
  5. JEECG 商业版本最近新增什么功能啦?
  6. 利用matlab点云工具处理点云
  7. Codeforces Round #380~#400 div2 总结 - updating
  8. [转] error LNK2026: 模块对于 SAFESEH 映像是不安全的
  9. 史上最便捷搭建RocketMQ服务器的方法
  10. pyqt5 点击开始执行_PyQt5教程——第一个程序(2)
  11. app安全渗透测试详细方法流程
  12. WDM驱动程序的基本结构和实例
  13. Google的C++编程规范总结
  14. android 遥控器配置文件,[转载]android万能遥控器之一--前言及发射部分的简单实现...
  15. Personalized Federated Learning with Moreau Envelopes论文阅读+代码解析
  16. vim编辑器如何删除一行或者多行内容
  17. 2017清华大学计算机考研机试答案(含代码)
  18. 微型计算机原理daa,单片微机原理、汇编与C51及接口技术(第2版)
  19. hnustoj 2108 湖南科技大学2019年大学生计算机程序设计新生赛
  20. tensorflow+python flask进行手写识别_Tensorflow训练识别手写数字0-9

热门文章

  1. 【vue】webpack插件svg-sprite-loader---实现自己的icon组件
  2. Linux 下打包报错:enospc (no space left on device)
  3. 函数的递归调用(专题)
  4. 36个非常有趣的互动网站设计作品范例
  5. ExtJS 4.1有什么值得期待?
  6. 一个有趣的关于flash和多种设备交互等技术应用的演示网站
  7. 网页中自动换行问题〔zz〕
  8. kafka-manager 安装
  9. python进阶-面向对象编程四:包装授权和自定制列表某些方法
  10. 达沃时代发布分布式块存储服务系统 启动存储生态圈