线性表的链式实现


用链式实现的线性表,公共接口ADT跟上一篇一样


1,有序链表


成员变量和构造函数:


private LinearNode front;
private int count;


public LinkedOrderedList()
{
front
= null;
count
= 0;



实现清单(将ADT和有序链表扩展的独有操作分别作了注释):


ContractedBlock.gifExpandedBlockStart.gifLinkedOrderedList
package List;

import Bag.LinearNode;

public class LinkedOrderedList implements ListADT {

private LinearNode front;
private int count;


public LinkedOrderedList()
{
front
= null;
count
= 0;
}



//三种链表的接口公共操作(实现是一样的)

public int size() {
return count;
}

public boolean isEmpty() {
return (count == 0);
}


public Object first() {
if(size() == 0){
System.out.println(
"链表为空,没有元素");
return null;
}
return front.getElement();
}

public Object last() {
if(size() == 0){
System.out.println(
"链表为空,没有元素");
return null;
}
LinearNode last
= front;//遍历链表求last的代码
for(int i = 0;i < count-1;i++)
last
= last.getNext();
return last.getElement();
}


public Object removeFirst() {
if(size() == 0){
System.out.println(
"链表为空,没有元素");
return null;
}
Object result
= front.getElement();
front
= front.getNext();
count
--;
return result;
}

public Object removeLast() {
if(size() == 0){
System.out.println(
"链表为空,没有元素");
return null;
}
LinearNode last
= front;
for(int i = 0;i < count-1;i++)
last
= last.getNext();
count
--;//count-1自动删除最后一个结点
return last.getElement();
}

public Object remove(Object element) {
Object result
= null;
if(size() == 0){//如果为空
System.out.println("链表为空,没有元素");
return null;
}
else if(front.getElement().equals(element)){//如果是链表的第一个元素
result = front.getElement();
front
= front.getNext();
count
--;
}
else{
LinearNode pre,current;
pre
= front;
for(int i = 0;i < count-1;i++)
{
current
= pre.getNext();
if(current.getElement().equals(element))
{
result
= current.getElement();
pre.setNext(current.getNext());
//如果current到了最后一个元素,getNext就是null
count--;
return result;
}
pre
= pre.getNext();
}
}
return result;
}


public boolean contains(Object element) {
LinearNode temp
= front;
for(int i = 0;i < count;i++){
if(temp.getElement().equals(element))
return true;
temp
= temp.getNext();
}
return false;
}




//有序链表扩展的操作

public void add(Comparable element){

LinearNode node
= new LinearNode(element);

LinearNode last
= front;
for(int i = 1;i < count;i++)
last
= last.getNext();

if(size() == 0){//链为空
front = node;
count
++;
return;
}
else if(element.compareTo(front.getElement()) < 0){//插入在链首
node.setNext(front);
front
= node;
count
++;
return;
}
else if(element.compareTo(last.getElement()) > 0){//插入在链尾
last.setNext(node);
count
++;
}
else{//插入在链中间
LinearNode current = front;
LinearNode next
= current.getNext();

for(int i = 0;i < count-1;i++){

if(element.compareTo(next.getElement()) < 0){
current.setNext(node);
node.setNext(next);
count
++;
return;
}
current
= next;
next
= next.getNext();
}
}
}





public static void main(String[] args) {

LinkedOrderedList list
= new LinkedOrderedList();

System.out.println(
"将0到24打乱顺序加入表,因为是有序表,它将自动排好序");
for(int i = 20;i < 25;i++)
list.add(i);
for(int i = 0;i < 10;i++)
list.add(i);
for(int i = 10;i < 20;i++)
list.add(i);

System.out.println(
"表的大小为: " + list.size());
System.out.println(
"表为空吗?: " + list.isEmpty());
System.out.println(
"表的第一个元素为: " + list.first());
System.out.println(
"表的最后一个元素为: " + list.last());

System.out.println(
"\n删除第一个元素");
list.removeFirst();
System.out.println(
"表的大小为: " + list.size());
System.out.println(
"表为空吗?: " + list.isEmpty());
System.out.println(
"表的第一个元素为: " + list.first());
System.out.println(
"表的最后一个元素为: " + list.last());

System.out.println(
"\n再接着删除最后一个元素");
list.removeLast();
System.out.println(
"表的大小为: " + list.size());
System.out.println(
"表为空吗?: " + list.isEmpty());
System.out.println(
"表的第一个元素为: " + list.first());
System.out.println(
"表的最后一个元素为: " + list.last());

System.out.println(
"\n再接着删除指定元素20,15,10,5");
list.remove(
20);
list.remove(
10);
list.remove(
15);
list.remove(
5);
list.remove(
23);
System.out.println(
"表的大小为: " + list.size());
System.out.println(
"表为空吗?: " + list.isEmpty());
System.out.println(
"表的第一个元素为: " + list.first());
System.out.println(
"表的最后一个元素为: " + list.last());
}

}






2,无序链表


成员变量,构造函数,公共操作完全一样,扩展的操作:


ContractedBlock.gifExpandedBlockStart.gifLinkedUnorderedList
//无序链表扩展的操作

public void addToFront(Object element){
LinearNode node
= new LinearNode(element);
node.setNext(front);
front
= node;
count
++;
}

public void addToRear(Object element){
LinearNode last
= front;
for(int i = 0;i < count-1;i++)
last
= last.getNext();
LinearNode node
= new LinearNode(element);
last.setNext(node);
count
++;
}

public void addAfter(Object after,Object element){
LinearNode temp
= front;
LinearNode elenode
= new LinearNode(element);

for(int index = 0;index < count;index++){

if(temp.getElement().equals(after) && index != count-1)
{
elenode.setNext(temp.getNext());
temp.setNext(elenode);
count
++;
return;
}
else if(temp.getElement().equals(after) && index == count-1)
{
LinearNode last
= front;
for(int i = 0;i < count-1;i++)
last
= last.getNext();
last.setNext(elenode);
count
++;
return;
}

temp
= temp.getNext();
}
}



3,索引链表

扩展的操作:

ContractedBlock.gifExpandedBlockStart.gifLinkedIndexedList
//索引链表扩展的操作

public void add(Object element){//在表尾插入

if(size() == 0)
{
front
= new LinearNode(element);
count
++;
return;
}

LinearNode node
= new LinearNode(element);
LinearNode last
= front;
for(int i = 0;i < count-1;i++)
last
= last.getNext();
last.setNext(node);
count
++;
}

public void add(int index,Object element){
LinearNode node
= new LinearNode(element);
if(index == 0)
{
node.setNext(front);
front
= node;
count
++;
}
else
{
LinearNode pre
= front;
for(int i = 0;i < index-1;i++)
pre
= pre.getNext();
LinearNode current
= pre.getNext();
node.setNext(current);
pre.setNext(node);
count
++;
}
}

public void set(int index,Object element){//设置某个索引上的元素(覆盖原来的,不需要移动元素)
LinearNode node = new LinearNode(element);
LinearNode temp
= front;
for(int i = 0;i < index;i++)
temp
= temp.getNext();
temp.setElement(element);
}

public Object get(int index){//返回某个索引上的元素
LinearNode temp = front;
for(int i = 0;i < index;i++)
temp
= temp.getNext();
return temp.getElement();
}

public int indexOf(Object element){//返回某个元素的索引
LinearNode temp = front;
for(int index = 0;index < count;index++){
if(element.equals(temp.getElement()))
return index;
temp
= temp.getNext();
}
return -1;
}

public Object remove(int index){//移除指定索引上的元素
if(index == 0)
{
Object result
= front.getElement();
front
= front.getNext();
count
--;
return result;
}
else if(index == count-1)
{
LinearNode last
= front;
for(int i = 0;i < count;i++)
last
= last.getNext();
Object result
= last.getElement();
count
--;
return result;
}
else
{
LinearNode pre
= front;
for(int i = 0;i < index-1;i++)
pre
= pre.getNext();
LinearNode current
= pre.getNext();
Object result
= current.getElement();
pre.setNext(current.getNext());
count
--;
return result;
}
}




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

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

相关文章

mysql5.7组复制多主一从搭建_MySql5.7-多源复制(多主单从)

1.1.主库配置my.cnf#确保唯一server-id1#作为Master要开启binloglog-binmysql-bin#binlog format有三种形式&#xff1a;Statement、Mixed、Row&#xff0c;默认设置为mixedbinlog-formatmixed#需要同步的库&#xff0c;不指定默认同步全部库binlog-do-dbradius#不需要同步的库…

我敢打赌,这世界没有python数据分析解决不了的问题

相信许多做数据的都有这样的经历&#xff1a;你花了大半天整合了一张数据表&#xff0c;却因为其他部门的错误&#xff0c;导致表格结构全错了&#xff01;于是你又要吭哧吭哧重新来过...每次数据都重复洗一遍&#xff0c;还这么慢&#xff0c;要是有一劳永逸的方法就好了。一劳…

mysql 存储二进制数据_为什么在MySQL中存储二进制数据?

Im a little confused - what are the pros of storing binary data in DB? Is it for security reasons, or there are some more complicated motives i dont see?Thanks for your time.解决方案As opposed to what? Putting it in the filesystem?The drawbacks to usin…

福利再度来袭,R语言数据分析书籍值得你拥有

在这个大数据的时代&#xff0c;数据分析和数据挖掘的重要性日益明显&#xff0c;小编也一直有意识地收集相关数据集&#xff0c;经过长时间的积累和沉淀&#xff0c;已经拥有十几本有关用R做数据分析和数据挖掘的书籍&#xff0c;有《统计建模与R软件》&#xff08;含源码&…

在 .NET Core 中使用 ViewConfig 调试配置

介绍.NET Core 中的配置包含了多个配置提供程序&#xff0c;包括了 appsettings.json&#xff0c;环境变量&#xff0c;命令行参数等&#xff0c;还有一些扩展的自定义提供程序&#xff0c;比如说 ApolloConfig&#xff0c;AgileConfig 这些&#xff0c;然后从键值对中读取配置…

有趣!机器学习预测《守望先锋》里的赢家

网络游戏及电竞流媒体业务正在崛起为一个巨大的市场。在去年的英雄联盟世界锦标赛中&#xff0c;仅一场半决赛就有高达 1.06 亿人观看&#xff0c;甚至超过了 2018 年“超级碗”的观看人数。另一个成功的例子是 Twitch&#xff0c;目前有数千游戏玩家在上面直播玩游戏&#xff…

C#8.0宝藏好物Async streams

之前写《.NET gRPC 核心功能初体验》&#xff0c;利用gRPC双向流做了一个打乒乓的Demo&#xff0c;存储消息的对象是IAsyncEnumerable<T>&#xff0c;这个异步可枚举泛型接口支撑了gRPC的实时流式通信。本文我将回顾分享foreach/yield return/async await语法糖的本质如何…

连接mysql数据库2013_使用VS2013 + EF6 + .NET4.5 连接Mysql数据库

1、安装插件在使用Visual Studio 2013添加ADO.NET实体数据模型新建连接时&#xff0c;默认是没有Mysql选项的。此时我们需要安装两个东西&#xff1a;1、mysql-for-visualstudio&#xff1a;Mysql的Visual Studio插件&#xff0c;推荐1.2.3版本2、mysql-connector-net&#xff…

重磅来袭,2018 年 6 月编程语言排行榜

TIOBE 编程语言社区最新发布了 2018 年 6 月排行榜&#xff0c;和 5 月榜单相比&#xff0c;前九名没有任何变化&#xff0c;依然是 Java、C、C、Python、C#、Visual Basic .NET、PHP、JavaScript、SQL。5月份第十名的Ruby在这个月下降了一名&#xff0c;而R则上升一名&#xf…

mysql bench linux_MySQL Study之--Linux下安装MySQL workbench工具

系统环境&#xff1a;操作系统&#xff1a; RedHat EL6.4(64)WorkBench&#xff1a; mysql-workbench-community-6.0.9MySQL Workbench是一款专为MySQL设计的ER/数据库建模工具。它是著名的数据库设计工具DBDesigner4的继任者。你可以用MySQL Workbench设计和创建新的数据库图示…

.NET6发布了Preview2,这点超越过去10年!

从ASP.NET的性能诟病&#xff0c;到.NET Core的性能持续改进&#xff0c;在每一个.NET Core版本都能看到性能优化提升的介绍。.NET Core3.1在各种性能排行中霸榜&#xff0c;.NET5再度提升了性能&#xff0c;前些天发布的.NET Preview2&#xff0c;通过PGO &#xff08;Profile…

人工智能预测2018年世界杯 | 德国人打破历史将在俄罗斯上取得最后的胜利?

2018年俄罗斯世界杯近在眼前&#xff0c;比赛将于6月14日~7月15日在俄罗斯的各地举行。但世界杯还没开始&#xff0c;人们已经出现了各种各样的“比赛结果预测”。其中不乏有一些专业人士以及原足球选手&#xff0c;也有许多“生物”对此预测。前几年&#xff0c;章鱼哥保罗就准…

Q+开放的互联网:腾讯QQ “亮剑” 开放平台

&#xff08;图一&#xff09; 近日&#xff0c;人民日报的腾讯广告&#xff08;图一&#xff09;&#xff0c;在网民心中引起不小的波动。看着图中憨厚的小企鹅&#xff0c;后面是数以万计的应用软件&#xff0c;给人一种大将领兵征战沙场的感觉。图片左下角是 “Q开放的互联网…

php查询mysql乱码_php 查询mysql乱码怎么办

php查询mysql乱码的解决办法&#xff1a;1、修改PHP页面语言本身的编码类型&#xff1b;2、将MySQL字符集更改为“UTF8”&#xff1b;3、使用ultraplus中的编码转换功能进行转换。php读取mysql中文数据出现乱码的解决方法1.PHP页面语言本身的编码类型不合适&#xff0c;这时候&…

猝不及防,Google成功“造人”令人胆寒!人类迎来史上最惨失业潮…

01猝不及防&#xff01;这次&#xff0c;Google“造人”了&#xff01;5月8号&#xff0c;谷歌召开一年一度的Google I/O大会。谷歌CEO劈柴直接祭出了这次大会的王牌AI&#xff0c;这个智能过人的Al让人看完不禁倒吸一口凉气……相比Apple Siri和Microsoft Cortana只能机械式对…

雷军这个程序员!真的牛逼!

阅读本文大概需要3分钟。这两天忙着给CEO汇报工作以及跟进几个新产品的进展&#xff0c;忙到连新闻都没时间看。今天终于轻松了点&#xff0c;早上起来刷了刷知乎&#xff0c;看见一个让我惊呆了的消息&#xff1a;雷军要造车了&#xff01;雷军宣称亲自带队&#xff0c;初期就…

poj2545

题意&#xff1a;给出三个质数&#xff0c;求这素因子只有这三个质数的数中第k大的。 分析&#xff1a;用一个数列&#xff0c;第一位是1。用三个指针指向三个prime要乘的被乘数&#xff0c;最开始都指向1。每次取乘积最小的加入数组&#xff0c;并把指针后移。加入时要判断是否…

微软发布 Windows 10 预览版 Build 21343:此电脑和回收站等启用全新图标

微软已向开发频道&#xff08;Dev&#xff09;的 Windows 预览体验成员发布了 Windows 10 Insider Preview Build 21343 更新。内置应用和文件夹启用全新图标从去年开始&#xff0c;微软就不断为 Windows 10 内置应用重新设计图标。在 Windows 10 版本 20H2 更新中&#xff0c;…

什么样的程序员会让人讨厌

我有一个朋友&#xff0c;就是一个程序员&#xff0c;找他做事的时候&#xff0c;最让人讨厌了。00不愿意帮我修电脑。我说电脑坏了&#xff0c;想让他看看&#xff0c;他先是叫我检查插头&#xff0c;然后叫我重启&#xff0c;重启好之后&#xff0c;他冷淡的说&#xff1a;以…

金州勇士队,硅谷黑科技打造的NBA奇迹!

【导读&#xff1a;2018NBA决赛表明&#xff0c;创业如同打球&#xff0c;应该学习勇士&#xff0c;团队作战打“群架”&#xff0c;单打独斗像骑士&#xff0c;纵有“小皇帝”&#xff0c;也难免被横扫】NBA是中国人民最喜欢观看和讨论的美国体育联赛。在NBA诸强中&#xff0c…