栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

用Java实现一个静态链表的方法步骤

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

用Java实现一个静态链表的方法步骤

什么是静态链表?

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

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

在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();
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持考高分网。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/135226.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号