思路1初始化一个新的头节点reverseHead,然后遍历旧链表,利用头插法向reverseHead进行插入

思路2:
1.反转相当于数据的更换(1和n,2和n-1,3和n-2)n为链表的长度
2.通过遍历进行数据的更换,n/2为循环退出的条件

package com.company;

import java.util.Stack;

/**
* @author:抱着鱼睡觉的喵喵
* @date:2021/2/4
* @description:
*/
public class LinkedListDemo {
public static void main(String[] args) {
Node node1 = new Node(1, 96, "Ronin");
Node node2 = new Node(2, 100, "lisi");
Node node3 = new Node(3, 99, "张三");
Node node4 = new Node(4, 63, "zsh");
Node node5 = new Node(5, 65, "zms"); SingleLinkedList singleLinkedList = new SingleLinkedList(); singleLinkedList.add(node1);
singleLinkedList.add(node2);
singleLinkedList.add(node2);
singleLinkedList.add(node4);
singleLinkedList.add(node5); System.out.println("链表反转后的数据如下:");
getReverse2(singleLinkedList.getNode());
singleLinkedList.list();
} /**
* 链表的反转 方法1
* 思路:1.反转相当于数据的更换(1和n,2和n-1,3和n-2)n为链表的长度
* 2.通过遍历进行数据的更换,n/2为循环退出的条件
*
* @param head
* @return
*/
public static void getReverse(Node head) {
if (head.next == null) {
System.out.println("LinkedList is empty!");
return;
}
int length = getLength(head);
int num1 = 0;
int num2 = 0;
Node mid = new Node();
for (int i = 1, j = length; i <= length / 2; i++, j--) {
Node temp = head;
Node cur = head;
while (true) {
temp = temp.next;
num1++;
if (num1 == i) {
num1 = 0;
break;
}
}
while (true) {
cur = cur.next;
num2++;
if (j == num2) {
num2 = 0;
break;
}
}
mid.sno = temp.sno;
mid.score = temp.score;
mid.data = temp.data;
temp.sno = cur.sno;
temp.score = cur.score;
temp.data = cur.data;
cur.sno = mid.sno;
cur.score = mid.score;
cur.data = mid.data; }
Node temp2 = head.next;
while (temp2 != null) {
System.out.println(temp2);
temp2 = temp2.next;
}
} /**
* 链表的反转2
* 思路:
* 初始化一个新的头节点reverseHead,然后遍历链表head,利用头插法向reverseHead进行插入
*
* @param head
*/
public static void getReverse2(Node head) {
if (head.next == null) {
System.out.println("LinkedList is empty!");
return;
}
Node reverseHead = new Node(0, 0, "");
Node cur = null;
Node temp = head.next;
while (temp != null) {
cur = temp.next;
temp.next = reverseHead.next;
reverseHead.next = temp;
temp = cur;
}
head.next = reverseHead.next;
} //节点类
class Node {
public Node next;
public int sno;
public int score;
public String data; public Node() {
} public Node(int Sno, int NScore, String Data) {
this.sno = Sno;
this.score = NScore;
this.data = Data;
} @Override
public String toString() {
return "Node{" +
"sno=" + sno +
", score=" + score +
", data='" + data + '\'' +
'}';
}
} //链表操作类
class SingleLinkedList {
private Node head = new Node(0, 0, ""); //初始化头节点 public Node getNode() {
return head;
} // add student data
public void add(Node node) { //数据添加
Node temp = head;
while (temp.next != null) {
temp = temp.next;
}
temp.next = node;
} //output
public void list() { //遍历数据进行打印
Node temp = head.next;
if (temp == null) {
System.out.println("LinkedList is empty!");
} else {
while (temp != null) {
System.out.println(temp);
System.out.println();
temp = temp.next;
}
}
}
}

Java实现单链表的反转的更多相关文章

  1. 理解单链表的反转(java实现)

    要求很简单,输入一个链表,反转链表后,输出新链表的表头.   反转链表是有2种方法(递归法,遍历法)实现的,面试官最爱考察的算法无非是斐波那契数列和单链表反转,递归方法实现链表反转比较优雅,但是对于不 ...

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

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

  3. Java实现单链表的各种操作

    Java实现单链表的各种操作 主要内容:1.单链表的基本操作 2.删除重复数据 3.找到倒数第k个元素   4.实现链表的反转   5.从尾到头输出链表 6.找到中间节点 7.检测链表是否有环 8.在 ...

  4. java实现单链表的增删功能

    JAVA 实现单链表的增删功能 package linked; class LinkedTable{ } public class LinkedTableTest { public static vo ...

  5. 秒懂单链表及其反转(reverse)

    什么是链表,这种数据结构是由一组Node组成的,这群Node一起表示了一个序列.链表是最普通,最简单的数据结构(物理地址不连续),它是实现其他数据结构如stack, queue等的基础. 链表比起数组 ...

  6. JAVA数据结构——单链表

    链表:一. 顺序存储结构虽然是一种很有用的存储结构,但是他有如下几点局限性:1. 因为创造线性表的时候已经固定了空间,所以当需要扩充空间时,就需要重新创建一个地址连续的更大的存储空间.并把原有的数据元 ...

  7. 使用java实现单链表(转载自:https://www.cnblogs.com/zhongyimeng/p/9945332.html)

    使用java实现单链表----(java中的引用就是指针)转载自:https://www.cnblogs.com/zhongyimeng/p/9945332.html ? 1 2 3 4 5 6 7 ...

  8. java实现单链表反转(倒置)

    据说单链表反转问题面试中经常问,而链表这个东西相对于数组的确稍微难想象,因此今天纪录一下单链表反转的代码. 1,先定义一个节点类. 1 public class Node { 2 int index; ...

  9. java实现单链表常见操作

    一.概述: 本文主要总结单链表常见操作的实现,包括链表结点添加.删除:链表正向遍历和反向遍历.链表排序.判断链表是否有环.是否相交.获取某一结点等. 二.概念: 链表: 一种重要的数据结构,HashM ...

随机推荐

  1. OSPF协议原理及配置4-邻接关系的建立和LSDB同步

    OSPF协议原理及配置4-邻接关系的建立和LSDB同步   进入ExStart状态后,广播和NBMA型网络要等待4倍的Hello时间,确定DR和BDR.然后建立邻接关系,并交互链路状态通告,以使用LS ...

  2. 02 基础 卸载JDK 安装JDK Java程序运行机制

    基础 JDK:Java Development Kit(Java开发者工具 包含JRE和JVM) JRE:Java Runtime Environment(java运行时环境,包含JVM) JVM:J ...

  3. [C++]C风格、C++风格和C++11特性的线程池

    线程池概念 假设完成一项任务需要的时间=创建线程时间T1+线程执行任务时间T2+销毁线程时间T3,如果T1+T3的时间远大于T2,通常就可以考虑采取线程池来提高服务器的性能 thread pool就是 ...

  4. 这个好玩又实用的jupyter插件我真的爱了

    1 简介 最近在逛github的时候偶然发现一款特别的jupyter插件stickyland,通过它我们可以在jupyter中以一种非常特别的交互操作方式,对我们的的代码单元格进行组织和展示,今天的文 ...

  5. 报错———http://mybatis.org/dtd/mybatis-3-mapper.dtd 报红解决方案

    初次使用mybatis时,下面红线上的地址报红. 解决方法是:将http://mybatis.org/dtd/mybatis-3-mapper.dtd拷贝.添加到下面标记处.

  6. 三大主流软件负载均衡器对比(LVS & Nginx & Haproxy)

    LVS:1.抗负载能力强.抗负载能力强.性能高,能达到F5硬件的60%:对内存和cpu资源消耗比较低2.工作在网络4层,通过vrrp协议转发(仅作分发之用),具体的流量由linux内核处理,因此没有流 ...

  7. C#: .net序列化及反序列化 [XmlElement(“节点名称”)] [XmlAttribute(“节点属性”)] (下篇)

    介绍 XML 序列化 .NET Framework 开发员指南   序列化是将对象转换为容易传输的格式的过程.例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间 ...

  8. Linux C申请内存三种基本方式

    一份代码可以知道具体方式和原理: int main() { int stack_a; int stack_b; static int static_c; static int static_d; in ...

  9. js file对象 文件大小转换可视容易阅读的单位

    function returnFileSize(number) { if(number < 1024) { return number + 'bytes'; } else if(number & ...

  10. 什么是线程池(thread pool)?

    在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内 存资源或者其它更多资源.在 Java 中更是如此,虚拟机将试图跟踪每一个对象, 以便能够在对象销毁后进行垃圾回收.所以提高服务程 ...