当前位置: 首页 > news >正文

算法-反转单向链表

需求

在这里插入图片描述
在这里插入图片描述

思路

  • 链表必有节点,节点两要素:当前元素值,下一个节点地址
import java.util.Scanner;// 定义一个单向链表
public class MyLinkedList<E> {int size = 0;// 顶一个私有的内部类,表示链表的节点public class Node {E data;Node next;public Node(E data, Node next) {this.data = data;this.next = next;}}
}

添加节点

  • 第一次插入直接插入头结点
  • 后面都使用尾插法,插入到最后一个元素的后面(所以需要一个一个遍历)
// 添加节点
public Node add(E e) {Node head = null;Scanner scanner = new Scanner(System.in);while (true) {System.out.println("请输入数据,输入exit退出");String data = scanner.next();if (data.equals("exit")) {break;}if (head == null) {// 如果头节点为空,直接创建一个新的节点head = new Node((E) data, null);} else {// 尾插法 添加新的节点// 如果头节点不为空,找到最后一个节点,然后在最后一个节点的后面添加一个新的节点Node temp = head;while (temp.next != null) {temp = temp.next;}// 在最后一个节点的后面添加一个新的节点temp.next = new Node((E) data, null);}size++;}return head;
}

遍历

// 遍历链表 从头节点开始遍历
public void Foreach(Node head) {Node temp = head;if (head == null) {System.out.println("链表为空");return;}while (temp != null) {System.out.println(temp.data + " ");temp = temp.next;}
}

链表指定位置反转

  • 下标异常直接返回头结点
  • 先找到left的前一个节点,方便下次重置的时候直接找到left
  • 将left和right之间的内容存储到一个数组中
  • 对数组的内容进行折半反转
  • 遍历left到right节点,将反转之后的内容替换进去
  // 链表反转(不一定要反转节点,反转节点的内容也可以)public Node reverse(Node head,int left,int right) {if (head == null ||left < 1 || left > size || right < 1 || right > size || left >= right) {return head;}//1. 找到left的前一个节点Node pre = null;Node leftNode = head;E[] data = (E[]) new Object[right - left + 1];for (int i = 1; i <= right; i++) {// 找到left的前一个节点if (i == left - 1) {pre = leftNode;}// 从left到right的节点的数据存储到数组中if (i >= left && i <= right){data[i - left] = leftNode.data;}// leftNode指向下一个节点leftNode = leftNode.next;}//2. 找到right的后一个节点Node rightNode = leftNode;// 3.反转data数组for (int i = 0; i < data.length / 2; i++) {E temp = data[i];data[i] = data[data.length - i - 1];data[data.length - i - 1] = temp;}// 4.从pre节点开始,将data数组中的数据赋值给链表中的节点for (int i = 0; i < data.length; i++) {pre.next.data = data[i];pre = pre.next;}return head;}

测试:

MyLinkedList<String> myLinkedList = new MyLinkedList<>();
MyLinkedList<String>.Node head = myLinkedList.add("aa");
myLinkedList.Foreach(head);
myLinkedList.reverse(head,2,4);
System.out.println("反转后的链表");
myLinkedList.Foreach(head);
  • 反转前的链表:aa bb cc dd ee ff gg
  • 反转后的链表:aa dd cc bb ee ff gg
http://www.lryc.cn/news/337718.html

相关文章:

  • Ps 滤镜:方框模糊
  • MTK Android13 霸屏实现
  • PyTorch神经网络打印存储所有权重+激活值(运行时中间值)
  • grpc-教程(golang版)
  • Spring与Spring Boot的区别:从框架设计到应用开发
  • React Hooks 全解: 常用 Hooks 及使用场景详解
  • 第十三届蓝桥杯真题:x进制减法,数组切分,gcd,青蛙过河
  • JavaEE初阶Day 6:多线程(4)
  • 微信小程序 django+nodejs电影院票务售票选座系统324kd
  • 基于springboot实现桂林旅游景点导游平台管理系统【项目源码+论文说明】计算机毕业设计
  • idea 开发serlvet汽车租赁管理系统idea开发sqlserver数据库web结构计算机java编程layUI框架开发
  • Unity之PUN实现多人联机射击游戏的优化(Section 3)
  • PDF锐化
  • 【python和java】
  • C盘满了怎么办,清理工具TreeSize
  • 【vue】watch 侦听器
  • 校招生如何准备软件测试、测试开发岗位的面试?
  • 蓝桥杯抱佛脚篇~
  • 基于springboot的大学城水电管理系统源码数据库
  • AI大模型探索之路-应用篇2:Langchain框架ModelIO模块—数据交互的秘密武器
  • 【SSH】群晖开启ssh访问
  • Vue 移动端(H5)项目怎么实现页面缓存(即列表页面进入详情返回后列表页面缓存且还原页面滚动条位置)keep-alive缓存及清除keep-alive缓存
  • 【MVCC】深入浅出彻底理解MVCC
  • 【问题解决】ubuntu安装新版vscode报code-insiders相关错误
  • 【Python】面向对象(专版提升2)
  • Vscode设置滚轮进行字体大小的调节
  • 【QT入门】Qt自定义控件与样式设计之控件提升与自定义控件
  • Spring Validation解决后端表单校验
  • Harmony鸿蒙南向驱动开发-UART接口使用
  • 【示例】MySQL-事务控制示例:账户转账-savepoint关键字