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

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

  1. package com.company;
  2. import java.util.Stack;
  3. /**
  4. * @author:抱着鱼睡觉的喵喵
  5. * @date:2021/2/4
  6. * @description:
  7. */
  8. public class LinkedListDemo {
  9. public static void main(String[] args) {
  10. Node node1 = new Node(1, 96, "Ronin");
  11. Node node2 = new Node(2, 100, "lisi");
  12. Node node3 = new Node(3, 99, "张三");
  13. Node node4 = new Node(4, 63, "zsh");
  14. Node node5 = new Node(5, 65, "zms");
  15. SingleLinkedList singleLinkedList = new SingleLinkedList();
  16. singleLinkedList.add(node1);
  17. singleLinkedList.add(node2);
  18. singleLinkedList.add(node2);
  19. singleLinkedList.add(node4);
  20. singleLinkedList.add(node5);
  21. System.out.println("链表反转后的数据如下:");
  22. getReverse2(singleLinkedList.getNode());
  23. singleLinkedList.list();
  24. }
  25. /**
  26. * 链表的反转 方法1
  27. * 思路:1.反转相当于数据的更换(1和n,2和n-1,3和n-2)n为链表的长度
  28. * 2.通过遍历进行数据的更换,n/2为循环退出的条件
  29. *
  30. * @param head
  31. * @return
  32. */
  33. public static void getReverse(Node head) {
  34. if (head.next == null) {
  35. System.out.println("LinkedList is empty!");
  36. return;
  37. }
  38. int length = getLength(head);
  39. int num1 = 0;
  40. int num2 = 0;
  41. Node mid = new Node();
  42. for (int i = 1, j = length; i <= length / 2; i++, j--) {
  43. Node temp = head;
  44. Node cur = head;
  45. while (true) {
  46. temp = temp.next;
  47. num1++;
  48. if (num1 == i) {
  49. num1 = 0;
  50. break;
  51. }
  52. }
  53. while (true) {
  54. cur = cur.next;
  55. num2++;
  56. if (j == num2) {
  57. num2 = 0;
  58. break;
  59. }
  60. }
  61. mid.sno = temp.sno;
  62. mid.score = temp.score;
  63. mid.data = temp.data;
  64. temp.sno = cur.sno;
  65. temp.score = cur.score;
  66. temp.data = cur.data;
  67. cur.sno = mid.sno;
  68. cur.score = mid.score;
  69. cur.data = mid.data;
  70. }
  71. Node temp2 = head.next;
  72. while (temp2 != null) {
  73. System.out.println(temp2);
  74. temp2 = temp2.next;
  75. }
  76. }
  77. /**
  78. * 链表的反转2
  79. * 思路:
  80. * 初始化一个新的头节点reverseHead,然后遍历链表head,利用头插法向reverseHead进行插入
  81. *
  82. * @param head
  83. */
  84. public static void getReverse2(Node head) {
  85. if (head.next == null) {
  86. System.out.println("LinkedList is empty!");
  87. return;
  88. }
  89. Node reverseHead = new Node(0, 0, "");
  90. Node cur = null;
  91. Node temp = head.next;
  92. while (temp != null) {
  93. cur = temp.next;
  94. temp.next = reverseHead.next;
  95. reverseHead.next = temp;
  96. temp = cur;
  97. }
  98. head.next = reverseHead.next;
  99. }
  100. //节点类
  101. class Node {
  102. public Node next;
  103. public int sno;
  104. public int score;
  105. public String data;
  106. public Node() {
  107. }
  108. public Node(int Sno, int NScore, String Data) {
  109. this.sno = Sno;
  110. this.score = NScore;
  111. this.data = Data;
  112. }
  113. @Override
  114. public String toString() {
  115. return "Node{" +
  116. "sno=" + sno +
  117. ", score=" + score +
  118. ", data='" + data + '\'' +
  119. '}';
  120. }
  121. }
  122. //链表操作类
  123. class SingleLinkedList {
  124. private Node head = new Node(0, 0, ""); //初始化头节点
  125. public Node getNode() {
  126. return head;
  127. }
  128. // add student data
  129. public void add(Node node) { //数据添加
  130. Node temp = head;
  131. while (temp.next != null) {
  132. temp = temp.next;
  133. }
  134. temp.next = node;
  135. }
  136. //output
  137. public void list() { //遍历数据进行打印
  138. Node temp = head.next;
  139. if (temp == null) {
  140. System.out.println("LinkedList is empty!");
  141. } else {
  142. while (temp != null) {
  143. System.out.println(temp);
  144. System.out.println();
  145. temp = temp.next;
  146. }
  147. }
  148. }
  149. }

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. CF809E题解

    给定一个排列 \(a_i\) 和一棵树,求: \[\frac 1 {n(n-1)}\sum_{i=1}^n\sum_{j=1}^n \varphi(a_i \times a_j) \times dis ...

  2. C#/VB.NET 将Html转为Excel

    本文介绍通过C#和VB.NET代码展示将Html转为Excel文档的方法. dll引用 方法1 将 Spire.XLS for .NET 下载到本地,解压,安装.完成安装后,在安装路径下找到BIN文件 ...

  3. linux指令_张三

    1.基础指令语法 ls (路径) 含义:列出当前工作目录下的所有文件/文件夹的名称 pwd(printworkingdirectory,打印当前工作目录) cd (路径)       作用:用于切换当 ...

  4. 搭建Loki、Promtail、Grafana轻量级日志系统(centos7)

    搭建Loki.Promtail.Grafana轻量级日志系统(centos7)--简称PLG 需求 公司项目采用微服务的架构,服务很多,每个服务都有自己的日志,分别存放在不同的服务器上.当查找日志时需 ...

  5. C# 将CSV转为Excel

    CSV(Comma Separated Values)文件是一种纯文本文件,包含用逗号分隔的数据,常用于将数据从一个应用程序导入或导出到另一个应用程序.通过将CSV文件转为EXCEL,可执行更多关于数 ...

  6. luoguP6623 [省选联考 2020 A 卷] 树(trie树)

    luoguP6623 [省选联考 2020 A 卷] 树(trie树) Luogu 题外话: ...想不出来啥好说的了. 我认识的人基本都切这道题了. 就我只会10分暴力. 我是傻逼. 题解时间 先不 ...

  7. Spring Cache缓存框架

    一.序言 Spring Cache是Spring体系下标准化缓存框架.Spring Cache有如下优势: 缓存品种多 支持缓存品种多,常见缓存Redis.EhCache.Caffeine均支持.它们 ...

  8. Jenkins+Docker+Git 自动化部署

    Jenkins+Docker+Git 自动化部署图文教程 https://blog.csdn.net/qq_38252039/article/details/89791247 前言: 通过几天的学习和 ...

  9. (转)Linux的文件权限与目录配置

    ref:https://www.cnblogs.com/ysocean/p/7712412.html#_label1_0 (转)Linux文件权限和目录配置 1.Linux命令的普遍语法格式 命令格式 ...

  10. 使用SpringDataJdbc的@Query注解实现自动映射结果集 ----- RowMapper接口

    使用@Query注解的时候,常常需要写sql来映射非域类的实例,通常的做法就是 实现 RowMapper接口,然后new实例一个一个的设置值进去...为此.出世了自动映射工具类 注意事项:此抽象类只是 ...