什么是静态链表?

对于线性链表,也可用一维数组来进行描述。这种描述方法便于在没有指针类型的高级程序设计语言中使用链表结构。

用数组描述的链表,即称为静态链表。

在C语言中,静态链表的表现形式即为结构体数组,结构体变量包括数据域data和游标CUR。

静态链表的节点

数据域:用于存储数据元素的值

游标:即数组下标,表示直接后继元素所在数组中的位置

public class StaticLinkedListNode {

public T data; // 数据

public int cursor; // 游标

...

}

注:通常静态链表会将第一个数据元素放到数组下标为1(即a[1])的位置中。

备用链表

静态链表中,除了数据本身通过游标组成链表外,还需要有一条连接各个空闲位置的链表,称为备用链表。

作用:回收数组中未使用或者之前使用过(现在不用)的存储空间,留待后期使用。即静态链表使用数组申请的物理空间中,存在两个链表,一条连接数据,另一条连接数组中为使用的空间。

注:通常备用链表的表头位于数组下标为0(a[0])的位置,而数据链表的表头位于数组下标为1(a[1])的位置。

静态链表中设置备用链表的好处是,可以清楚地知道数组中是否有空闲位置,以便数据链表添加新数据时使用。比如,若静态链表中数组下标为 0 的位置上存有数据,则证明数组已满。

完整代码

public class StaticLinkedListNode {

public T data;

private int cursor;

public StaticLinkedListNode(T data, int cursor) {

this.cursor = cursor;

}

public T getData() {

return data;

}

public void setData(T data) {

this.data = data;

}

public int getCursor() {

return cursor;

}

public void setCursor(int cursor) {

this.cursor = cursor;

}

}

public class StaticLinkedList {

StaticLinkedListNode[] nodes;

private static final int MAX_SIZE = 100;

private int length;

public StaticLinkedList() {

nodes = new StaticLinkedListNode[MAX_SIZE];

for (int i = 0; i < MAX_SIZE; i++) {

nodes[i] = new StaticLinkedListNode(null, i + 1);

}

nodes[MAX_SIZE - 1].setCursor(0);

this.length = 0;

}

// 链表实际长度

public int Length() {

return length;

}

// 判断使用数组是否为空

public boolean isEmpty() {

return length == 0;

}

// 判断备用链表是否为空

public boolean isFull() {

return length == MAX_SIZE;

}

// 插入一个节点

public boolean addTo(T data, int index) {

if (isFull() || index > MAX_SIZE || index < -1 || data == null)

return false;

if (index == 0) {

insert(data);

return true;

}

if (index > Length()) {

index = Length();

}

// 获取第一个使用节点的下标

int firstUse = nodes[MAX_SIZE - 1].getCursor();

// 获取备用数组第一个节点的下标

int firstNull = nodes[0].getCursor();

for (int i = 1; i < index; i++) {

firstUse = nodes[firstUse].getCursor();

}

// 获取目标节点的后续节点

int nextUse = nodes[firstUse].getCursor();

int nextNull = nodes[firstNull].getCursor();

nodes[0].setCursor(nextNull);

nodes[firstUse].setCursor(firstNull);

nodes[firstNull].setCursor(nextUse);

nodes[firstNull].setData(data);

length++;

return true;

}

public void insert(T data) {

int t = nodes[MAX_SIZE - 1].getCursor();

int firstNull = nodes[0].getCursor();

nodes[MAX_SIZE - 1].setCursor(firstNull);

nodes[0].setCursor(nodes[firstNull].getCursor());

nodes[firstNull].setCursor(t);

nodes[firstNull].setData(data);

length++;

}

public void print() {

int first = nodes[MAX_SIZE - 1].getCursor();

System.out.println("链表:");

for (int i = first; i != 0; ) {

System.out.print(nodes[i].getData() + " ");

i = nodes[i].getCursor();

}

}

// 删除指定节点

public boolean delete(T data) {

if (isEmpty()) {

return false;

}

int temp = MAX_SIZE - 1;

while (temp != 0) {

if (nodes[nodes[temp].getCursor()].getData() == data) {

int p = nodes[temp].getCursor();

nodes[temp].setCursor(nodes[p].getCursor());

nodes[p].setCursor(nodes[0].getCursor());

nodes[0].setCursor(p);

nodes[p].setData(null);

length--;

return true;

}

temp = nodes[temp].getCursor();

}

return false;

}

// 删除所有节点

public boolean deleteAll() {

if (isEmpty()) {

return true;

}

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

nodes[i].setCursor(i + 1);

nodes[i].setData(null);

}

nodes[MAX_SIZE - 1].setCursor(0);

nodes[MAX_SIZE - 1].setData(null);

length = 0;

return true;

}

public void printAll() {

System.out.println("链表:");

for (int i = 0; i < MAX_SIZE; i++) {

System.out.print("[" + i + " " + nodes[i].getData() + " " + nodes[i].getCursor() + "]");

if (i % 5 == 0 && i != 0) {

System.out.println();

}

}

}

public static void main(String[] args) {

StaticLinkedList list = new StaticLinkedList();

list.insert("A");

list.insert("B");

list.insert("C");

list.insert("D");

list.insert("E");

list.addTo("X", 2);

System.out.println(list.Length());

list.print();

// list.printAll();

// list.deleteAll();

}

}

java静态链表_用Java实现一个静态链表相关推荐

  1. 用宝塔面板网站php变成静态,宝塔面板可以建立静态网站吗?如何部署一个静态页面?...

    大多数情况下我们在服务器上安装宝塔面板后建立的博客网站大多数都是带有数据库的动态网站,如WordPress.ZBlogPHP.Typecho.emlog.Discuz!Q等,很少有建立纯静态网站.所以 ...

  2. 宝塔面板可以建立静态网站吗?如何部署一个静态页面?

    大多数情况下我们在服务器上安装宝塔面板后建立的博客网站大多数都是带有数据库的动态网站,如WordPress.ZBlogPHP.Typecho.emlog.Discuz!Q等,很少有建立纯静态网站.所以 ...

  3. java jsp取静态常量_获取java静态

    Android NDK开发系列教程4:对类变量进行操作 终于建了一个自己个人小站:https://huangtianyu.gitee.io,以后优先更新小站博客,欢迎进站,O(∩_∩)O~~ 通常我们 ...

  4. 为什么java需要静态类_为什么Java主要方法是静态的?

    小编典典 只是约定.实际上,即使名称main()和传入的参数也完全是约定俗成的. 当您运行java.exe(或Windows上的javaw.exe)时,实际上发生了几次Java本机接口(JNI)调用. ...

  5. java gui变量_关于java:静态/类变量和GUI

    本问题已经有最佳答案,请猛点这里访问. 最近,我被拉回到了Java编程的学术目的,我遇到了一些有趣的在我的第一个项目. 我必须为一个店面设计一个图形用户界面,其中有执行各种任务的按钮,我注意到我的变量 ...

  6. Java main方法_解释Java中的main方法,及其作用_一个java文件中可包含多个main方法

    public static void main(String[] args) {} 或者 public static void main(String args[]) {} main方法是我们学习Ja ...

  7. java静态成员方法_关于java:在静态方法中访问类的静态成员

    我在java中有这个代码我用netbeans写它 class sample { public static int x; public int y; sample() { x=0; } } publi ...

  8. 怎样用java编写日志_用JAVA写一个日志类程序以供大家学习

    中华网络安全联盟    作者:jacoo    来源:本站原创    时间:2006-4-18 说明: 尽管JAVA类库和其他工具提供了不少的纪录程序运行状态的日志类,我发觉也 不是万能的,有时需要根 ...

  9. java反射实例_关于java反射的一个案例

    案例: *需求:"写一个框架",可以帮我们创建任意类的对象,并且执行其中任意的方法. *实现: 1.配置文件 2.反射 *步骤: 1.将需要创建的对象的全类名和需要执行的方法定义在 ...

最新文章

  1. 空间点像素索引(三)
  2. html工具类,一些小工具
  3. 自动驾驶多相机与多雷达数据融合方法汇总
  4. js插件 ajax跨域,ajax跨域问题
  5. 数据库考研SQL操作
  6. zabbix监控之Centos基于LNMP环境安装
  7. 让你的silverlight更炫(一):从自定义控件说起
  8. matlab单机带负荷系统模型,用MATLAB仿真实现电力系统静态稳定性分析
  9. ZooKeeper 了解
  10. 固高运动卡的使用 3 运动之Jog运动
  11. matlab 自写 自适应中值滤波 matlab自适应中值滤波算法
  12. Scrapy框架爬取百度新闻
  13. linux区分三种用户角色,Linux用户角色划分
  14. 咸鱼 转转,苹果产品真伪验证
  15. java中画幅相机推荐_中画幅数码相机推荐
  16. 100部未看过的电影【20181121更新】
  17. 重命名Active Directory域名
  18. JDBC、封装JDBC连接池、第三方连接池工具
  19. python可以干什么
  20. c++:十进制转化为二进制

热门文章

  1. attribute 'groups' of type 'int' is not usable in a script method
  2. name 'false' is not defined
  3. tensorflow filter_variables
  4. pil拷贝,剪切,缩放
  5. OpenGL+VS2015+WIN10 demo
  6. undefined reference to symbol ‘_ZN2cv7imwriteERKNS_6StringERKNS_11_InputArrayERKSt6vectorIiSaIiEE‘
  7. VPN之DSVPN的介绍
  8. 如何生成java_如何生成JavaAPI doc
  9. html制作第二页,订单第二页.html
  10. 华为畅享8可以云闪付吗_华为畅享8、魅族16X、海信彩墨屏阅读手机A5C对比