java与数据结构(2)---java实现静态链表

时间:2022-08-23 07:35:14

结点类

 1 //结点类
2 class Node<T> {
3 private T data;
4 private int cursor;
5
6 Node(T data, int cursor) {
7 this.data = data;
8 this.cursor = cursor;
9 }
10
11 public void setData(T data) {
12 this.data = data;
13 }
14
15 public void setCursor(int cursor) {
16 this.cursor = cursor;
17 }
18
19 public T getData() {
20 return this.data;
21 }
22
23 public int getCursor() {
24 return this.cursor;
25 }
26
27 public String toString() {
28 StringBuffer sb = new StringBuffer();
29 sb.append(getData());
30 sb.append(" ");
31 sb.append(getCursor()+" ");
32 return sb.toString();
33 }
34 }

链表接口

//静态链表接口
interface StaticLinkListable<T> { int Length();//静态链表长度 int getBackupListFirstIndex();//获取当前备用链表的首结点地址 T increaseSpaceToBackupList(int k);//将空闲空间回收至备用链表 boolean insert(T element);//尾插 boolean insert(int i, T element);//在第i个位置插入元素element T remove(int i);//删除表中第i个位置的元素 void removeAll();//删除表中所有元素
}

静态链表实现类

//实现了静态链表接口的结点链表
class NodeList<T> implements StaticLinkListable<T> {
private Node[] node=null;//泛型数组
private static final int maxSize = 15; //创建一张长度为1000的备用链表
NodeList() {
this(maxSize);
} //创建一张长度为maxSize的备用链表
NodeList(int maxSize) {
node = new Node[maxSize];//泛型数组如何创建?
 //0-998中的cursor依次存放1,2,3,4...999;下标0元素的cursor为1;下标999元素的cursor为0
for(int i = 0; i < maxSize-1; i++) {
node[i] = new Node<T>(null,i+1);
 //System.out.println(i+" "+node[i]);
}
node[maxSize-1] = new Node<T>(null,0);
//System.out.println(maxSize-1+" "+node[maxSize-1]);
}    //获取静态链表中已经被使用了的数组空间
public int Length() {
int j = node[maxSize-1].getCursor();
int length = 0;
while (j != 0) {
j = node[j].getCursor();
length++;
}
return length;
}    //向备用链表申请一个数组单元,给插入操作使用;若备用链表非空,则返回备用首结点的下标,否则返回0
public int applySpaceFromBackupList() {
int i = getBackupListFirstIndex();//当前数组第一个元素的cursor存的值,就是要返回的备用首结点的下标
if(i != 0 ) {
node[0].setCursor(i+1);//由于要拿出备用链表的一个单元使用,那么将该单元的下个单元设为备用首结点
}
return i;
} //获取备用链表首结点所处的单元下标
public int getBackupListFirstIndex() {
return node[0].getCursor();
} //尾插
public boolean insert(T element) {
int i = Length();
return insert(i,element);
} //在表中第i个位置插入数据元素T e
public boolean insert(int i, T element) {
if(i >= maxSize-1) {
return false;
}
int L = Length();
if(i >= L)
i = L+1;
if(i < 1)
i = 1;
int k = maxSize-1;//999
//向备用链表申请空间,以存放要添加的数据元素结点
int m = applySpaceFromBackupList();
if(m > 0) {
//找到数组第i个元素的前一个元素的位置
for(int j = 1; j < i; j++) {
k = node[k].getCursor();
}
//创建一个新的结点,数据是element,cursor指向第i个元素
//将新生成的结点放入链表的最后一个单元,即备用链表的上一个单元
node[m] = new Node<T>(element,node[k].getCursor());
//使当前数组第i个元素前面元素的cursor指向链表尾结点
node[k].setCursor(m);
}
return true;
} //删除表中第i个位置的数据元素
public T remove(int i) {
if(i > maxSize - 1)
return null;
if(i < 1)
i = 1;
int l = Length();
if(i > l)
i = l;
int k = maxSize-1;
//找出第i个位置的前一个数据元素位置
for(int j = 1; j < i; j++)
k = node[k].getCursor();
int m = 0;
//取出前一个数据元素的cursor,也就是i
m = node[k].getCursor();
//将前一个数据元素的cursor设置为当前位置上的cursor,即让当前元素的上一个元素的cursor指向当前元素的下一个元素
node[k].setCursor(node[m].getCursor());
//将删除的元素空间回收至备用链表,并将删除位置作为添加元素的优先存储空间
return increaseSpaceToBackupList(m);
} //删除表中所有的元素
public void removeAll() {
int firIndex = node[0].getCursor();
while(node[0].getCursor() != 1) {
remove(Length());
}
} //把下标为k的空闲结点回收到备用链表,即将k作为备用链表首结点位置,数组第一个元素中的cursor指向第k个单元
public T increaseSpaceToBackupList(int k) {
T temp = (T)node[k].getData();
int m = node[0].getCursor();
node[k].setCursor(m);
node[0].setCursor(k);
return temp;
} public String toString() {
StringBuffer sb = new StringBuffer();
sb.append("[ ");
sb.append(node[0]+" ");
int k = node[maxSize-1].getCursor();
while(k != 0) {
sb.append(node[k]);
k = node[k].getCursor();
}
sb.append(node[maxSize-1]+" ");
sb.append("]");
return sb.toString();
} }

测试

package bistu;

/*
*@author Nora-Xie
*@time 2013-10-02 PM 22:02
*/
/*早期的高级编程语言如:Basic、Fortran没有指针,链表结构的实现无法动态实现,于是有人想到用数组实现链表,这就是静态链表。*/
/*由数组描述的链表就是静态链表,其核心是两个数据成员、一个概念和首尾特殊元素三个部分。*/
/*两个数据成员:实际有用的数据data+存储数据的数组单元下标值cursor;*/
/*一个概念:备用链表是静态链表中,删除元素和未被使用到的数组元素;*/
/*首尾特殊元素:数组的第一个元素不存放数据信息,其cursor中存放备用链表第一个结点的下标值;最后一个元素cursor保存着第一个数据值的下标
*/ public class TestStaticLinkList {
public static void main(String[] args) {
StaticLinkListable<String> list = new NodeList<String>();
list.insert("甲");
list.insert("乙");
list.insert("丙");
list.insert("丁");
list.insert("戊");
list.insert("己");
list.insert("庚");
list.insert("辛");
list.insert("壬");
list.insert("奎");
System.out.println(list);
list.remove(12);
System.out.println(list);
list.removeAll();
System.out.println(list);
}
}

java与数据结构(2)---java实现静态链表的更多相关文章

  1. Java数据结构-线性表之静态链表

    静态链表的定义: 节点由一个一维数组和一个指针域组成,数组用来存放数据元素,而指针域里面的指针(又称游标)用来指向下一个节点的数组下标. 这种链表称之为静态链表. 链表中的数组第一个和最后一个位置须要 ...

  2. c数据结构链式存储-静态链表

    #include "string.h" #include "ctype.h" #include "stdio.h" #include &qu ...

  3. java:数据结构复习(三)链表队列

    @TOC 和栈一样,队列也是表,但是使用队列的特点是先进先出. 队列模型 队列的基本操作是入队,它是在表的末端插入一个元素,和出队,它是删除在表开头的一个元素 graph LR A[<kbd&g ...

  4. java与数据结构&lpar;8&rpar;---java实现链队列

    链队列 实际上就是单链表,只是规定了删除在队头进行,添加在队尾进行. 链队列代码结构 package list.queue; public interface Queuable<T>; p ...

  5. java与数据结构&lpar;4&rpar;---java实现双向循环链表

    线性表之链式存储结构双向循环链表 双向循环链表:每个结点包含了数据.直接前驱地址指针和直接后驱地址指针,头结点的直接前驱指向尾结点,尾结点的直接后驱指向头结点,头尾相连构成一个可正可反的圆环.可以形象 ...

  6. java与数据结构&lpar;3&rpar;---java实现循环链表

    循环链表:将单链表中尾结点的指针由空指针改为指向头结点,就使整个单链表形成一个环,这种首尾相接的单链表称为单链表循环表,即循环链表. 循环链表与单链表最重要的区别是:尾结点的指针,不再是p->n ...

  7. java与数据结构&lpar;6&rpar;---java实现链栈

    栈之链式存储结构链栈 链栈 栈的链式存储结构成为链栈.链栈是没有头结点,头结点就是栈顶指针top. 代码结构 package list; public interface Stackable;公共接口 ...

  8. 【Java】 大话数据结构&lpar;3&rpar; 线性表之静态链表

    本文根据<大话数据结构>一书,实现了Java版的静态链表. 用数组描述的链表,称为静态链表. 数组元素由两个数据域data和cur组成:data存放数据元素:cur相当于单链表中的next ...

  9. JAVA 基本数据结构--数组、链表、ArrayList、Linkedlist、hashmap、hashtab等

    概要 线性表是一种线性结构,它是具有相同类型的n(n≥0)个数据元素组成的有限序列.本章先介绍线性表的几个基本组成部分:数组.单向链表.双向链表:随后给出双向链表的C.C++和Java三种语言的实现. ...

随机推荐

  1. ecshop 导出exl表格

    // 导出订单 if(isset($_POST['export'])){ // 统计金额 $sl = "SELECT SUM(goods_amount) as total from&quot ...

  2. ajax提交请求返回对象异常问题

    很早之前的一个ajax请求今天突然不能正常显示数据了. 控制台看到报错 POST http://xxx:8081/spider-war/spiderControl.do?method=getTaskL ...

  3. sed命令手册

    sed 是一种在线编辑器,它一次处理一行内容. 处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space). 接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内 ...

  4. 【锁】Oracle锁系列

    [锁]Oracle锁系列 1  BLOG文档结构图 2  前言部分 2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ...

  5. datepicker冲突

    公司里的项目由于发展较快,很多东西都没有好好梳理一下,以至于有很多的潜在的问题. 最近就遇到了一个比较坑的问题.datepicker 有两个插件库中的datepicker插件比较有名.一个是jQuer ...

  6. gitignre

    1.配置语法: 以斜杠“/”开头表示目录: 以星号“*”通配多个字符: 以问号“?”通配单个字符 以方括号“[]”包含单个字符的匹配列表: 以叹号“!”表示不忽略(跟踪)匹配到的文件或目录: PLAC ...

  7. mysqldump导出csv格式文件

    mysqldump bstar -t  -T/tmp Nvr  --fields-enclosed-by=\" --fields-terminated-by=, --where=" ...

  8. DWR3&period;0框架入门(3) —— ScriptSession的维护及优化

    1.ScriptSession使用中存在的问题        在上一节实现了服务器的推送功能,但是根据 ScriptSession的生命周期我们可以得出以下几点的问题:   (1)ScriptSess ...

  9. Vijos P1113 不高兴的津津【模拟】

    不高兴的津津 描述 津津上初中了.妈妈认为津津应该更加用功学习,所以津津除了上学之外,还要参加妈妈为她报名的各科复习班.另外每周妈妈还会送她去学习朗诵.舞蹈和钢琴.但是津津如果一天上课超过八个小时就会 ...

  10. 配置多个 git 账号的 ssh密钥

    背景 在工作中,我们通常会以 ssh 的方式配置公司的 git 账号,但是平时也会使用 github 管理自己的项目.因此,我们需要为自己的 github 创建一个新的 git 账号,这就需要生成新的 ...