java建立线性表的链式结构,数据结构学习----线性表的链式表示(Java实现)

线性表接口LList:

package com.clarck.datastructure.linked;

/**

* 线性表接口LList,描述线性表抽象数据类型,泛型参数T表示数据元素的数据类型

*

* @author clarck

*

*/

public interface LList {

/**

* 判断线性表是否空

* @return

*/

boolean isEmpty();

/**

* 返回线性表长度

* @return

*/

int length();

/**

* 返回第i(i≥0)个元素

* @param i

* @return

*/

T get(int i);

/**

* 设置第i个元素值为x

* @param i

* @param x

*/

void set(int i, T x);

/**

* 插入x作为第i个元素

* @param i

* @param x

*/

void insert(int i, T x);

/**

* 在线性表最后插入x元素

* @param x

*/

void append(T x);

/**

* 删除第i个元素并返回被删除对象

* @param i

* @return

*/

T remove(int i);

/**

* 删除线性表所有元素

*/

void removeAll();

/**

* 查找,返回首次出现的关键字为key元素

* @param key

* @return

*/

T search(T key);

}

单链表结点类:

package com.clarck.datastructure.linked;

/**

* 单链表结点类,T指定结点的元素类型

*

* @author clarck

*

* @param

*/

public class Node {

/**

* 数据域,保存数据元素

*/

public T data;

/**

* 地址域,引用后继结点

*/

public Node next;

/**

* 构造结点,data指定数据元素,next指定后继结点

*

* @param data

* @param next

*/

public Node(T data, Node next) {

this.data = data;

this.next = next;

}

/**

* 构造节点

*/

public Node() {

this(null, null);

}

/**

* 返回结点元素值对应的字符串

*/

@Override

public String toString() {

return this.data.toString();

}

/**

* 比较两个结点值是否相等,覆盖Object类的equals(obj)方法

*/

@SuppressWarnings("unchecked")

@Override

public boolean equals(Object obj) {

return obj == this || obj instanceof Node && this.data.equals(((Node)obj).data);

}

}

线性表的链式表示和实现:

package com.clarck.datastructure.linked;

/**

* 线性表的链式表示和实现 带头结点的单链表类,实现线性表接口

*

* @author clarck

*

* @param

*/

public class SinglyLinkedList implements LList {

/**

* 头指针,指向单链表的头结点

*/

public Node head;

/**

* 默认构造方法,构造空单链表

*/

public SinglyLinkedList() {

// 创建头结点,data和next值均为null

this.head = new Node();

}

/**

* 由指定数组中的多个对象构造单链表。采用尾插入构造单链表

* 若element==null,Java将抛出空对象异常;若element.length==0,构造空链表

*

* @param element

*/

public SinglyLinkedList(T[] element) {

// 创建空单链表,只有头结点

this();

// rear指向单链表最后一个结点

Node rear = this.head;

for (int i = 0; i < element.length; i++) {

rear.next = new Node(element[i], null);

rear = rear.next;

}

}

/**

* 判断单链表是否空,O(1)

*/

@Override

public boolean isEmpty() {

return this.head.next == null;

}

/**

* 返回单链表长度,O(n), 基于单链表遍历算法

*/

@Override

public int length() {

int i = 0;

// p从单链表第一个结点开始

Node p = this.head.next;

// 若单链表未结束

while (p != null) {

i++;

// p到达后继结点

p = p.next;

}

return i;

}

/**

* 返回第i(≥0)个元素,若i<0或大于表长则返回null,O(n)

*/

@Override

public T get(int i) {

if (i >= 0) {

Node p = this.head.next;

for (int j = 0; p != null && j < i; j++) {

p = p.next;

}

// p指向第i个结点

if (p != null) {

return p.data;

}

}

return null;

}

/**

* 设置第i(≥0)个元素值为x。若i<0或大于表长则抛出序号越界异常;若x==null,不操作。O(n)

*/

@Override

public void set(int i, T x) {

if (x == null)

return;

Node p = this.head.next;

for (int j = 0; p != null && j < i; j++) {

p = p.next;

}

if (i >= 0 && p != null) {

p.data = x;

} else {

throw new IndexOutOfBoundsException(i + "");

}

}

/**

* 插入第i(≥0)个元素值为x。若x==null,不插入。 若i<0,插入x作为第0个元素;若i大于表长,插入x作为最后一个元素。O(n)

*/

@Override

public void insert(int i, T x) {

// 不能插入空对象

if (x == null) {

return;

}

// p指向头结点

Node p = this.head;

// 寻找插入位置

for (int j = 0; p.next != null && j < i; j++) {

// 循环停止时,p指向第i-1结点或最后一个结点

p = p.next;

}

// 插入x作为p结点的后继结点,包括头插入(i<=0)、中间/尾插入(i>0)

p.next = new Node(x, p.next);

}

/**

* 在单链表最后添加x对象,O(n)

*/

@Override

public void append(T x) {

insert(Integer.MAX_VALUE, x);

}

/**

* 删除第i(≥0)个元素,返回被删除对象。若i<0或i大于表长,不删除,返回null。O(n)

*/

@Override

public T remove(int i) {

if (i >= 0) {

Node p = this.head;

for (int j = 0; p.next != null && j < i; j++) {

p = p.next;

}

if (p != null) {

// 获得原对象

T old = p.next.data;

// 删除p的后继结点

p.next = p.next.next;

return old;

}

}

return null;

}

/**

* 删除单链表所有元素 Java将自动收回各结点所占用的内存空间

*/

@Override

public void removeAll() {

this.head.next = null;

}

/**

* 顺序查找关键字为key元素,返回首次出现的元素,若查找不成功返回null

* key可以只包含关键字数据项,由T类的equals()方法提供比较对象相等的依据

*/

@Override

public T search(T key) {

if (key == null)

return null;

for (Node p = this.head.next; p != null; p = p.next)

if (p.data.equals(key))

return p.data;

return null;

}

/**

* 返回单链表所有元素的描述字符串,形式为“(,)”,覆盖Object类的toString()方法,O(n)

*/

@Override

public String toString() {

String str = "(";

for (Node p = this.head.next; p != null; p = p.next) {

str += p.data.toString();

if (p.next != null)

str += ","; // 不是最后一个结点时后加分隔符

}

return str + ")"; // 空表返回()

}

/**

* 比较两条单链表是否相等

*/

@SuppressWarnings("unchecked")

@Override

public boolean equals(Object obj) {

if (obj == this)

return true;

if (obj instanceof SinglyLinkedList) {

SinglyLinkedList list = (SinglyLinkedList) obj;

return equals(this.head.next, list.head.next);

}

return false;

}

/**

* 比较两条单链表是否相等,递归方法

*

* @param p

* @param q

* @return

*/

private boolean equals(Node p, Node q) {

return p == null && q == null || p != null && q != null

&& p.data.equals(q.data) && equals(p.next, q.next);

}

}

测试类:

package com.clarck.datastructure.linked;

/**

* 单链表的测试

*

* @author clarck

*

*/

public class SinglyLinkedList_test {

public static void main(String args[]) {

SinglyLinkedList lista = new SinglyLinkedList();

for (int i = 0; i <= 5; i++)

lista.insert(i, new String((char) ('A' + i) + ""));

System.out.println("lista: " + lista.toString() + ",length()="

+ lista.length());

lista.set(3, new String((char) (lista.get(0).charAt(0) + 32) + ""));

lista.remove(0);

lista.remove(3);

System.out.println("lista: " + lista.toString());

}

}

测试结果:

lista: (A,B,C,D,E,F),length()=6lista: (B,C,a,F)

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

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

相关文章

php prepare 批量,PreparedStatement批处理

PreparedStatement批量更新关键代码 无 import java.sql.Connection;import java.sql.PreparedStatement; //...String sql "insert into employee (name, city, phone) values (?, ?, ?)";Connection connection new getConnection();PreparedStatement pPrepa…

钉钉 php 推送,微信模板推送,钉钉信息推送

上午的时候看到有朋友需要微信推送&#xff0c;正好我也需要&#xff0c;之前一直用 Server 酱的&#xff0c;但是最近用不了&#xff0c;想找一个替代品&#xff0c;一开始准备选择钉钉&#xff0c;除了打卡&#xff0c;我很少使用钉钉&#xff0c;邮件提醒是备用方案&#xf…

java repaint 重画图形,学习笔记:WINDOWS的图形重绘基础

OnPaint()与OnDraw()的区别&#xff1a;OnPaint是WM_PAINT的消息响应函数&#xff0c;在MFC的基类里OnPaint函数调用了OnDraw()函数。OnPaint函数另外还调用了OnPrepareDC()函数。如果在窗口子类覆盖了OnPaint函数&#xff0c;当MFC调用我们重写的OnPaint函数时&#xff0c;就调…

php定义数据表类,phpwind中的数据库操作类

phpwind中的数据库操作类2021-01-22 20:12:15141/*来源&#xff1a;phpwind.net*/ClassDB{var$query_num0;functionDB($dbhost,$dbuser,$dbpw,$dbname,$pconnect0){$this->connect($dbhost,$dbuser,$dbpw,$dbname,$pconnect);}functionconnect($dbhost,$dbuser,$dbpw,$dbnam…

涡轮机叶片matlab强度分析论文,一种基于MATLAB及Pro_E的涡轮建模方法

自动化与控制与二一种基于&#xff2d;&#xff21;&#xff34;&#xff2c;&#xff21;&#xff22;及&#xff30;&#xff52;&#xff4f;&#xff0f;&#xff25;的涡轮建模方法王智明(中海油服油田技术事业部北京&#xff11;&#xff10;&#xff11;&#xff11;&am…

基于matlab的传热学虚拟实验开发,基于MATLAB的传热学课程虚拟实验软件的开发

215教育现代化2018 年 12 月第 49 期 教育信息技术 基于 MATLAB 的传热学课程虚拟实验软件的开发 周永利&#xff0c;李友荣&#xff0c;石万元&#xff0c;张力元&#xff0c;杨晨&#xff0c;卞煜&#xff0c;王国强&#xff0c;李俊&#xff0c;包键 ( 重庆大学 低品位能源利…

java做 binggo,Linux启动与停止spring boot工程的脚本示例

在springboot项目启动有三种方式&#xff1a;1、运行主方法程序2、使用命令mvn spring-boot:run 在命令行运行3、使用 mvn packpage打包位jar文件以后&#xff0c;使用java -jar yourapp.jar命令行运行一般我们在开发的时候经常使用的是前面两种运行方式&#xff0c;在部署实施…

php计划任务 框架,计划任务的使用 ThinkCMF内容管理框架,做最简约的ThinkPHP开源软件...

1、先不管是是否是独立分组&#xff0c;必须在Application\common\项目名下的Conf文件夹内创建2个文件一个是tags.php(项目默认有&#xff0c;直接加入需要执行的代码即可) 一个是 crons.php。注意这两个文件名为thinkphp标准文件名&#xff0c;不可以改变tages.php内容是&…

php按文章评论数排序,zblog获取分类文章排序按指定的时间排序、评论数量排序、浏览数量排序...

Zblog PHP在1.8版本的时候想要调用多个分类的文章&#xff0c;并且按照自己的需求去排序是很简单的事情&#xff0c;很多博友也利用这个方法进行最新文章排行、热门评论文章排行等等操作&#xff0c;现在随着ZblogPHP版本的升级&#xff0c;已经封装了数据库语句&#xff0c;导…

蚁群算法matlab vrp问题车辆限重,蚁群算法MATLAB解VRP问题

Excel exp12_3_2.xls内容&#xff1a;ANT_VRP函数&#xff1a;function [R_best,L_best,L_ave,Shortest_Route,Shortest_Length]ANT_VRP(D,Demand,Cap,iter_max,m,Alpha,Beta,Rho,Q)%% R_best 各代最佳路线%% L_best 各代最佳路线的长度%% L_ave 各代平均距离%% Shortest_Rout…

java线程6种状态转换,Java线程的生命周期和各种状态转换详解

在Java中&#xff0c;任何对象都有生命周期&#xff0c;线程也不例外&#xff0c;它也有自己的生命周期。当Thread对象创建完成时&#xff0c;线程的生命周期便开始了&#xff0c;当线程任务中代码正常执行完毕或者线程抛出一个未捕获的异常(Exception)或者错误(Error)时&#…

window10怎么卸载php,window_win10怎么卸载程序?win10卸载程序教程,当win10正式版发布以后,不少 - phpStudy...

win10怎么卸载程序&#xff1f;win10卸载程序教程当win10正式版发布以后&#xff0c;不少用户将电脑升级为Windows10系统后&#xff0c;不知道该如何卸载程序&#xff0c;本篇将为大家带来win10卸载程序教程&#xff0c;希望能够帮助到大家。win10怎么卸载程序方法一&#xff1…

matlab里dcgain,制系统的时域分析

一个动态系统的性能常用典型输入作用下的响应来描述。响应是指零初始值条件下某种典型的输入函数作用下对象的响应&#xff0c;控制系统常用的输入函数为单位阶跃函数和脉冲激励函数(即冲激函数)。在MATLAB的控制系统工具箱中提供了求取这两种输入下系统响应的函数。一、时域分…

php 添加音乐,PHP网站插入音乐

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼你找对地方了&#xff0c;我是IT之家大神光卡蒋一欣。我把代码发给你&#xff0c;直接运行即可entrance\01.gif......\........\02.gif......\........\03.jpg......\........\04.jpg......\........\05.jpg......\........\06.jpg…

在oracle数据库中显示异常,Oracle数据库出现ORA-01034错误的解决方案

类型&#xff1a;数据库类大小&#xff1a;42.1M语言&#xff1a;中文 评分&#xff1a;5.0标签&#xff1a;立即下载使用Oracle数据库的朋友经常会碰到的错误ORA-3113 "end of fileon communication channel" 就是这样的一个&#xff0c;我们可以简单的把这个错误理…

oracle数据库内核,深入内核:Oracle数据库里SELECT操作Hang解析

崔华&#xff0c;网名 dbsnakeOracle ACE Director&#xff0c;ACOUG 核心专家编辑手记&#xff1a;感谢崔华授权我们独家转载其精品文章&#xff0c;也欢迎大家向“Oracle”社区投稿。我们都知道在 Oracle 数据库里是“读不阻塞写&#xff0c;写不阻塞读”&#xff0c;那么是否…

oracle 如何形成死锁,Oracle数据表中的死锁情况解决方法

在进行数据库管理的过程中,经常会出现数据表被用户的一些不合理操作而导致表被锁定的情况,以下主要介绍如何查找哪些表被哪个用户所锁定,以及如何解除锁定:1.查找被锁定的表:select object_name,session_id,os_user_name,oracle_username,process,locked_mode,statusfrom v$loc…

php 分布式数据库查询,分布式数据库 · Thinkphp5.0完全开发手册 · 看云

# 分布式数据库ThinkPHP内置了分布式数据库的支持&#xff0c;包括主从式数据库的读写分离&#xff0c;但是分布式数据库必须是相同的数据库类型。配置database.deploy 为1 可以采用分布式数据库支持。如果采用分布式数据库&#xff0c;定义数据库配置信息的方式如下&#xff1…

matlab 电力系统动态仿真,基于Matlab的电力系统动态仿真分析

本文通过两个简单实例介绍了利用 !"#$"% &’(! )*, -./对电力系统进行仿真研究的方法! 包括"热工自动调节控制系统的仿真分析和电力电器系统的仿真分析# 0 热工调节控制系统仿真分析 对热工调节控制系统的性能分析包括静态特性和动态特性两个方面# 这里主要…

oracle read by other session,AWR报告中,read by other session ,如何解决?

你看你的top sql里全是动态采样的sql&#xff0c;默认10g以后optimizer_dynamic_sampling参数为level 2&#xff0c;一般为缺失统计信息会造成每次使用动态采样&#xff0c;虽然动态采样会在表频繁发生大批量改变时&#xff0c;一般可以生成更好的执行计划&#xff0c;但是也不…