Java单链表反转 详细过程
Java单链表反转 Java实现单链表翻转
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:是反转后新链表的头结点(即原来单链表的尾结点)
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;}}
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单链表反转 详细过程相关推荐
- 剑指offter Java单链表反转
应上篇文章说的做一篇单链表的反转问题.关于怎么创建单链表问题我已经写过了一篇:https://blog.csdn.net/nisemono_ct/article/details/95514797 单链 ...
- java 单链表反转_Java实现单链表翻转详解
单链表翻转比如有如下链表: 需要按照C B A 输出,我们可以有好几种方法: package org.andy.test; import java.util.ArrayList; import jav ...
- java单链表反转(头插法)详解
链表反转思路(简述): 链表分为单链表和双链表,细分为单向循环链表和双向循环链表.本章节主要讲述单向链表的反转.在接触到这张文章之前相信大家已经对链表(链表的组成部分)有所了解,链表内部由节点构成,每 ...
- Java实现单链表反转操作
单链表是一种常见的数据结构,由一个个节点通过指针方式连接而成,每个节点由两部分组成:一是数据域,用于存储节点数据.二是指针域,用于存储下一个节点的地址.在Java中定义如下: public class ...
- 数据结构1:单链表反转java代码解释
来源于尚硅谷的老师代码,只因其中有几行代码自己课上没听明白,课后自己整理了一下 首先完整代码如下: //将单链表反转 public static void reversetList(HeroNode ...
- java数据结构 - 单链表(腾讯面试题实现单链表反转)
直接上实现代码 //单链表的反转public static void reverseList(HeroNode head){//如果当前链表为空,或只有一个节点,无需反转if (head.next = ...
- java 反转jia链表_Java实现单链表反转
本文主要介绍单链表反转的两种方法,记录如下: 1. package com.leetcode; public class ListReverse { public static void main(S ...
- 单链表反转的原理和python代码实现
链表是一种基础的数据结构,也是算法学习的重中之重.其中单链表反转是一个经常会被考察到的知识点. 单链表反转是将一个给定顺序的单链表通过算法转为逆序排列,尽管听起来很简单,但要通过算法实现也并不是非常容 ...
- 【编程2】单链表+单链表反转(LeetCode. 206)
文章目录 一.链表 二.单链表 1.基本概念 (1)单链表 (2)头指针--必有元素 (3)头结点--非必需元素 (4)尾结点 2.查找操作 3.插入操作 4.删除操作 三.设计思想-- 时间 < ...
最新文章
- 关于Combobox的多选和单选情况
- 消费金融首推即时沟通工具“马上”探索科技金融发展新方向
- node更新到最新版本_win10怎么更新flash到最新版本「系统天地」
- 【直播 】ASP.NET Core解密底层设计逻辑
- JEECG 商业版本最近新增什么功能啦?
- 利用matlab点云工具处理点云
- Codeforces Round #380~#400 div2 总结 - updating
- [转] error LNK2026: 模块对于 SAFESEH 映像是不安全的
- 史上最便捷搭建RocketMQ服务器的方法
- pyqt5 点击开始执行_PyQt5教程——第一个程序(2)
- app安全渗透测试详细方法流程
- WDM驱动程序的基本结构和实例
- Google的C++编程规范总结
- android 遥控器配置文件,[转载]android万能遥控器之一--前言及发射部分的简单实现...
- Personalized Federated Learning with Moreau Envelopes论文阅读+代码解析
- vim编辑器如何删除一行或者多行内容
- 2017清华大学计算机考研机试答案(含代码)
- 微型计算机原理daa,单片微机原理、汇编与C51及接口技术(第2版)
- hnustoj 2108 湖南科技大学2019年大学生计算机程序设计新生赛
- tensorflow+python flask进行手写识别_Tensorflow训练识别手写数字0-9