博客
关于我
线型表的顺序存储结构----顺序表(学习笔记)
阅读量:489 次
发布时间:2019-03-07

本文共 2725 字,大约阅读时间需要 9 分钟。

首先,我们定义了一条长度为80的链表,该链表的元素编号从1到80。接下来,我们实现了链表的增、删、清空功能。以下是各操作的实现细节:

插入算法

  • 判断插入位置是否合理。如果位置超出链表长度或为负数,提示插入位置不对。
  • 向插入位置后面的所有元素向后移一位。
  • 将目标元素插入到指定位置。
  • 链表长度增加1。
  • 删除算法

  • 判断删除位置是否合理。若位置超出链表长度或为负数,提示位置不对。
  • 向删除位置后面的所有元素向前移一位。
  • 删除指定位置的元素。
  • 链表长度减1。
  • 查找算法

  • 使用for循环和equals方法逐一比较目标值和链表中每个元素的值。
  • 如果找到目标值,返回其索引值。
  • 下面是实现代码:

    public interface ListIntf {    public int size(); // 获取链表长度    public void clear(); // 清空链表    public boolean isEmpty(); // 判断是否为空表    public Object get(int i); // 获取i位置的元素    public int indexOf(Object obj); // 获取元素的索引位置    public Object getPre(Object obj); // 获取前驱元素    public Object getNext(Object obj); // 获取后驱元素    public void insertElementAt(Object obj, int i); // 插入元素    public Object remove(int i); // 移除元素    public Object remove(Object obj); // 移除元素}

    实现上述接口的具体类为Sqlist:

    public class Sqlist implements ListIntf {    final int maxlen = 100;    int len = 80;    int num[] = new int[maxlen];    public Sqlist() {        for (int i = 0; i < len; i++) {            num[i] = 0;        }    }    public int size() {        return len;    }    public void clear() {        for (int i = 0; i < num.length; i++) {            num[i] = 0;        }    }    public boolean isEmpty() {        int index = this.indexOf(null);        return index == -1;    }    public Object get(int i) {        return num[i - 1];    }    public int indexOf(Object obj) {        for (int i = 0; i < num.length; i++) {            if (obj.equals(num[i])) {                return i;            }        }        return -1;    }    public Object getPre(Object obj) {        int index = this.indexOf(obj);        if (index == 0) {            return null;        } else {            return num[index - 1];        }    }    public Object getNext(Object obj) {        int index = this.indexOf(obj);        if (index == num.length - 1) {            return null;        } else {            return num[index + 1];        }    }    public void insertElementAt(Object obj, int i) {        if (i < 1 || i > len) {            System.out.println("插入位置不对");        } else {            for (int j = len; j > i; j--) {                num[j + 1] = num[j];            }            num[i] = (int) obj;            len++;        }    }    public Object remove(int i) {        if (i < 1 || i > len) {            System.out.println("删除位置不对");            return null;        } else {            for (int j = i - 1; j >= 0; j--) {                num[j] = num[j + 1];            }            num[i - 1] = 0;            len--;            return num[i];        }    }}

    运行结果示例:

    • 索引16位置前驱元素为15
    • 索引16位置后驱元素为17
    • 索引16位置元素为17
    • 插入索引80的81后,链表为12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535454555657585960616263646566676869707172737475767778798081

    转载地址:http://uhwcz.baihongyu.com/

    你可能感兴趣的文章
    Netty工作笔记0020---Selectionkey在NIO体系
    查看>>
    Vue踩坑笔记 - 关于vue静态资源引入的问题
    查看>>
    Netty工作笔记0025---SocketChannel API
    查看>>
    Netty工作笔记0027---NIO 网络编程应用--群聊系统2--服务器编写2
    查看>>
    Netty工作笔记0050---Netty核心模块1
    查看>>
    Netty工作笔记0060---Tcp长连接和短连接_Http长连接和短连接_UDP长连接和短连接
    查看>>
    Netty工作笔记0077---handler链调用机制实例4
    查看>>
    Netty工作笔记0084---通过自定义协议解决粘包拆包问题2
    查看>>
    Netty常见组件二
    查看>>
    netty底层源码探究:启动流程;EventLoop中的selector、线程、任务队列;监听处理accept、read事件流程;
    查看>>
    Netty核心模块组件
    查看>>
    Netty框架的服务端开发中创建EventLoopGroup对象时线程数量源码解析
    查看>>
    Netty源码—2.Reactor线程模型一
    查看>>
    Netty源码—4.客户端接入流程一
    查看>>
    Netty源码—4.客户端接入流程二
    查看>>
    Netty源码—5.Pipeline和Handler一
    查看>>
    Netty源码—6.ByteBuf原理二
    查看>>
    Netty源码—7.ByteBuf原理三
    查看>>
    Netty源码—7.ByteBuf原理四
    查看>>
    Netty源码—8.编解码原理二
    查看>>