数据结构基础之《(16)—链表题目》

一、链表问题

1、对于笔试,不用太在乎空间复杂度,一切为了时间复杂度
2、对于面试,时间复杂度依然放在第一位,但是一定要找到空间最省的方法

二、快慢指针

逻辑:
慢指针一次走1步
快指针一次走2步
当快指针走完的时候,慢指针应该来到中点的位置

1、输入链表头节点,奇数长度返回中点,偶数长度返回上中点

2、输入链表头节点,奇数长度返回中点,偶数长度返回下中点

3、输入链表头节点,奇数长度返回中点前一个,偶数长度返回上中点前一个

4、输入链表头节点,奇数长度返回中点前一个,偶数长度返回下中点前一个

package class06;import java.util.ArrayList;/*** 快慢指针*/
public class Code01_LinkedListMid {public static class Node {public int value;public Node next;public Node(int v) {value = v;}}/*** 奇数情况返回中点,偶数情况返回上中点* @param head:头节点* @return*/public static Node midOrUpMidNode(Node head) {if (head == null || head.next == null || head.next.next == null) {return head;}// 链表有3个点或以上Node slow = head.next;Node fast = head.next.next;while (fast.next != null && fast.next.next != null) {slow = slow.next;fast = fast.next.next;}return slow;}/*** 奇数情况返回中点,偶数情况返回下中点* @param head:头节点* @return*/public static Node midOrDownMidNode(Node head) {if (head == null || head.next == null) {return head;}// 初始设置不一样Node slow = head.next;Node fast = head.next;while (fast.next != null && fast.next.next != null) {slow = slow.next;fast = fast.next.next;}return slow;}/*** 奇数情况返回中点前一个,偶数情况返回上中点前一个* @param head:头节点* @return*/public static Node midPreOrUpMidPreNode(Node head) {if (head == null || head.next == null || head.next.next == null) {return null;}Node slow = head;Node fast = head.next.next;while (fast.next != null && fast.next.next != null) {slow = slow.next;fast = fast.next.next;}return slow;}/*** 奇数情况返回中点前一个,偶数情况返回下中点前一个* @param head:头节点* @return*/public static Node midPreOrDownMidPreNode(Node head) {if (head == null || head.next == null) {return null;}if (head.next.next == null) {return head;}Node slow = head;Node fast = head.next;while (fast.next != null && fast.next.next != null) {slow = slow.next;fast = fast.next.next;}return slow;}public static Node right1(Node head) {if (head == null) {return head;}Node cur = head;ArrayList<Node> arr = new ArrayList<>();while (cur != null) {arr.add(cur);cur = cur.next;}return arr.get((arr.size() - 1) / 2);}public static Node right2(Node head) {if (head == null) {return null;}Node cur = head;ArrayList<Node> arr = new ArrayList<>();while (cur != null) {arr.add(cur);cur = cur.next;}return arr.get(arr.size() / 2);}public static Node right3(Node head) {if (head == null || head.next == null || head.next.next == null) {return null;}Node cur = head;ArrayList<Node> arr = new ArrayList<>();while (cur != null) {arr.add(cur);cur = cur.next;}return arr.get((arr.size() - 3) / 2);}public static Node right4(Node head) {if (head == null || head.next == null) {return null;}Node cur = head;ArrayList<Node> arr = new ArrayList<>();while (cur != null) {arr.add(cur);cur = cur.next;}return arr.get((arr.size() - 2) / 2);}public static void main(String[] args) {Node head = new Node(0);Node tail = head;for (int i = 1; i < 10; i++) {Node node = new Node(i);tail.next = node;tail = tail.next;}System.out.println(midOrUpMidNode(head).value);System.out.println(right1(head).value);System.out.println(midOrDownMidNode(head).value);System.out.println(right2(head).value);System.out.println(midPreOrUpMidPreNode(head).value);System.out.println(right3(head).value);System.out.println(midPreOrDownMidPreNode(head).value);System.out.println(right4(head).value);}
}

三、面试题1

给定一个单链表的头节点head,请判断该链表是否为回文结构
回文结构:正着念和返着念都一样,例如:12aa21、12321

1、栈的方法特别简单(笔试用)
1 -> 2 -> 3 -> 2 -> 1
第一遍遍历:一个一个放到栈里去
第二遍遍历:从栈里弹出一个(是倒叙),和第一个比较,以此类推

2、改原链表的方法就需要注意边界了(面试用)

1 -> 2 -> 3 <- 2 <- 1
               |
               |-> null

package class06;import java.util.Stack;import class06.Code01_LinkedListMid.Node;public class Code02_IsPalindromeList {public static class Node {public int value;public Node next;public Node(int data) {this.value = data;}}// need n extra spacepublic static boolean isPalindrome1(Node head) {Stack<Node> stack = new Stack<Node>(); //准备一个栈Node cur = head; //引用从头节点开始while (cur != null) {stack.push(cur); //所有节点加到栈里去cur = cur.next;}while (head != null) {//从头开始遍历,和栈中弹出的值比较if (head.value != stack.pop().value) {return false;}head = head.next;}return true;}// need n/2 extra space(省一点空间的方法)public static boolean isPalindrome2(Node head) {if (head == null || head.next == null) {return true;}//使用快慢指针,奇数定位到唯一终点,偶数定位到上中点Node right = head.next;Node cur = head;while (cur.next != null && cur.next.next != null) {right = right.next;cur = cur.next.next;}Stack<Node> stack = new Stack<Node>();while (right != null) {stack.push(right); //把右半部分加到栈里去right = right.next;}while (!stack.isEmpty()) {if (head.value != stack.pop().value) {return false;}head = head.next;}return true;}//不用容器的方法//把有右半部分逆序,左指针和右指针比较//need O(1) extra spacepublic static boolean isPalindrome3(Node head) {if (head == null || head.next == null) {return true;}Node n1 = head; //慢指针Node n2 = head; //快指针//找中点while (n2.next != null && n2.next.next != null) { // find mid noden1 = n1.next; // n1 -> midn2 = n2.next.next; // n2 -> end}//右半部分逆序n2 = n1.next; // n2 -> right part first noden1.next = null; // mid.next -> nullNode n3 = null;while (n2 != null) { // right part convertn3 = n2.next; // n3 -> save next noden2.next = n1; // next of right node convertn1 = n2; // n1 moven2 = n3; // n2 move}n3 = n1; // n3 -> save last noden2 = head; // n2 -> left first node//比较左右指针boolean res = true;while (n1 != null && n2 != null) { //check palindromeif (n1.value != n2.value) {res = false;break;}n1 = n1.next; // left to midn2 = n2.next; // right to mid}//右半部分还原n1 = n3.next;n3.next = null;while (n1 != null) { // recover listn2 = n1.next;n1.next = n3;n3 = n1;n1 = n2;}return res;}public static void main(String[] args) {int[] arr = {1, 2, 3, 3, 2, 1};Node head = new Node(1);Node tail = head;for (int i = 1; i < arr.length; i++) {Node node = new Node(arr[i]);tail.next = node;tail = tail.next;}System.out.println(isPalindrome1(head));System.out.println(isPalindrome2(head));System.out.println(isPalindrome3(head));}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/68055.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenHarmonyOS 3.2 编译生成的hap和app文件的名称如何配置追加版本号?

找了一圈发现官方的文档都是最新的&#xff0c;3.2很多API都不支持&#xff0c;比如获取OhosAppContext&#xff0c;通过OhosAppContext来获取应用版本号&#xff0c;最终是通过读取app.json5的文件内容来读取版本号&#xff0c;最终修改entry下的hvigorfile.ts如下&#xff0c…

mapbox加载geojson,鼠标移入改变颜色,设置样式以及vue中的使用

全国地图json数据下载地址 目录 html加载全部代码 方式一&#xff1a;使用html方式加载geojson 1. 初始化地图 2. 加载geojson数据 设置geojson图层样式&#xff0c;设置type加载数据类型 设置线条 鼠标移入改变颜色&#xff0c;设置图层属性&#xff0c;此处是fill-extru…

Langchain+讯飞星火大模型Spark Max调用

1、安装langchain #安装langchain环境 pip install langchain0.3.3 openai -i https://mirrors.aliyun.com/pypi/simple #灵积模型服务 pip install dashscope -i https://mirrors.aliyun.com/pypi/simple #安装第三方集成,就是各种大语言模型 pip install langchain-comm…

【kong gateway】5分钟快速上手kong gateway

kong gateway的请求响应示意图 安装 下载对应的docker 镜像 可以直接使用docker pull命令拉取&#xff0c;也可以从以下地址下载&#xff1a;kong gateway 3.9.0.0 docker 镜像 https://download.csdn.net/download/zhangshenglu1/90307400&#xff0c; postgres-13.tar http…

高效查找:二分查找算法解析

1.二分查找简介 二分查找算法&#xff08;Binary Search&#xff09;是一种高效的查找算法&#xff0c;适用于有序数组或序列。它的基本思想是通过逐步缩小查找范围&#xff0c;将查找区间一分为二&#xff0c;直到找到目标值或确定目标值不存在。 算法原理&#xff1a;在数组…

数据统计–图形报表(day11)

Apache ECharts 介绍 Apache ECharts 介绍 Apache ECharts 是一款基于 Javascript 的数据可视化图表库&#xff0c;提供直观&#xff0c;生动&#xff0c;可交互&#xff0c;可个性化定制的数据可视化图表。 官网地址&#xff1a;Apache ECharts 入门案例 Apache Echarts官方…

Docker可视化管理工具Portainer

Portainer简介 Portainer 是一个轻量级的、开源的容器管理工具&#xff0c;提供了一个直观的 Web 用户界面&#xff08;UI&#xff09;&#xff0c;用于管理 Docker 和 Kubernetes 环境。它简化了容器的部署、监控和管理&#xff0c;特别适合不熟悉命令行操作的用户或团队。 …

C++入门14——set与map的使用

在本专栏的往期文章中&#xff0c;我们已经学习了STL的部分容器&#xff0c;如vector、list、stack、queue等&#xff0c;这些容器统称为序列式容器&#xff0c;因为其底层是线性序列的数据结构&#xff0c;里面存储的是元素本身。而本篇文章我们要来认识一下关联式容器。 &am…

浅析云场景SSD实时迁移技术

在数据中心的运营管理中&#xff0c;负载均衡和系统容错是确保高效稳定运行的关键。SSD实时迁移技术&#xff0c;为解决这些问题提供了创新方案&#xff0c;成为数据中心技术发展的重要驱动力。 以AI训练任务为例&#xff0c;其运行时间长且无需用户频繁交互。数据中心的负载会…

同一局域网远程控制其他电脑以及Windows家庭版开启远程桌面等解决方法

1. 前言 家庭版的 Windows 10 和 Windows 11 默认不支持远程桌面功能。然而&#xff0c;我们可以通过使用 RDPWrap 项目来启用这一功能。 电脑的“设置”-> “远程桌面设置”中查看系统是否支持远程桌面 2.下载安装 RDPWrap 安装该项目使家庭版也支持远程桌面 项目地址&…

DeepSeek-R1:将强化学习用于激励大型语言模型的推理能力

目录 引言 一、DeepSeek-R1的贡献 二、DeepSeek-R1的方法 2.1、DeepSeek-R1-Zero&#xff1a;基础模型上的强化学习 2.2、DeepSeek-R1&#xff1a;冷启动强化学习 2.3、蒸馏&#xff1a;赋予小模型推理能力 三、DeepSeek-R1实验结果 3.1、模型优点 3.2、模型缺点 四、…

SQL Server 使用SELECT INTO实现表备份

在数据库管理过程中&#xff0c;有时我们需要对表进行备份&#xff0c;以防数据丢失或修改错误。在 SQL Server 中&#xff0c;可以使用 SELECT INTO 语句将数据从一个表备份到另一个表。 备份表的 SQL 语法&#xff1a; SELECT * INTO 【备份表名】 FROM 【要备份的表】 SEL…

数据库管理-第287期 Oracle DB 23.7新特性一览(20250124)

数据库管理287期 20245-01-24 数据库管理-第287期 Oracle DB 23.7新特性一览&#xff08;20250124&#xff09;1 AI向量搜索&#xff1a;算术和聚合运算2 更改Compatible至23.6.0&#xff0c;以使用23.6或更高版本中的新AI向量搜索功能3 Cloud Developer包4 DBMS_DEVELOPER.GET…

Android BitmapShader简洁实现马赛克,Kotlin(二)

Android BitmapShader简洁实现马赛克&#xff0c;Kotlin&#xff08;二&#xff09; 这一篇 Android BitmapShader简洁实现马赛克&#xff0c;Kotlin&#xff08;一&#xff09;-CSDN博客 遗留一个问题&#xff0c;xml定义的MyView为wrap_content的宽高&#xff0c;如果改成其…

程序代码篇---C++类.c\.h

文章目录 前言第一部分&#xff1a;C中的类1.类的定义2.成员变量&#xff08;属性&#xff09;3.成员函数&#xff08;方法&#xff09;4.访问修饰符私有受保护公有 5.构造函数和析构函数成员初始化列表方法重载 6.继承7.多态8.友元 第二部分&#xff1a;.c与.h文件头文件&…

智能化加速标准和协议的更新并推动验证IP(VIP)在芯片设计中的更广泛应用

作者&#xff1a;Karthik Gopal, SmartDV Technologies亚洲区总经理 智权半导体科技&#xff08;厦门&#xff09;有限公司总经理 随着AI技术向边缘和端侧设备广泛渗透&#xff0c;芯片设计师不仅需要考虑在其设计中引入加速器&#xff0c;也在考虑采用速度更快和带宽更高的总…

【问题】Chrome安装不受支持的扩展 解决方案

此扩展程序已停用&#xff0c;因为它已不再受支持 Chromium 建议您移除它。详细了解受支持的扩展程序 此扩展程序已停用&#xff0c;因为它已不再受支持 详情移除 解决 1. 解压扩展 2.打开manifest.json 3.修改版本 将 manifest_version 改为3及以上 {"manifest_ver…

大数据和人工智能融合展望

大数据技术和人工智能&#xff08;AI&#xff09;的融合是科技发展的方向&#xff0c;其实很多年前就已经提出来并在不断前行&#xff0c;未来几年将会因为算力的进步和AI技术的飞速发展继续加速。以下是我整理的几个可能的发展方向&#xff1a; 1. 数据处理和分析自动化&…

Vue入门(Vue基本语法、axios、组件、事件分发)

Vue入门 Vue概述 Vue (读音/vju/&#xff0c;类似于view)是一套用于构建用户界面的渐进式框架&#xff0c;发布于2014年2月。与其它大型框架不同的是&#xff0c;Vue被设计为可以自底向上逐层应用。Vue的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第三…

[云讷科技]Kerloud Falcon四旋翼飞车虚拟仿真空间发布

虚拟仿真环境作为一个独立的专有软件包提供给我们的客户&#xff0c;用于帮助用户在实际测试之前验证自身的代码&#xff0c;并通过在仿真引擎中添加新的场景来探索新的飞行驾驶功能。 环境要求 由于环境依赖关系&#xff0c;虚拟仿真只能运行在装有Ubuntu 18.04的Intel-64位…