全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Java数据结构(线性表)详解

线性表的链式存储与实现

实现线性表的另一种方法是链式存储,即用指针将存储线性表中数据元素的那些单元依次串联在一起。这种方法避免了在数组中用连续的单元存储元素的缺点,因而在执行插入或 删除运算时,不再需要移动元素来腾出空间或填补空缺。然而我们为此付出的代价是,需要在每个单元中设置指针来表示表中元素之间的逻辑关系,因而增加了额外的存储空间的开销.

单链表

链表是一系列的存储数据元素的单元通过指针串接起来形成的,因此每个单元至少有两个域,一个域用于数据元素的存储,另一个域是指向其他单元的指针。这里具有一个数据域和多个指针域的存储单元通常称为结点(node).

结点接口

package com.wjy.Data_Structure.linearlist.common;
public interface Node {
  /**
   * 获取结点数据域
   *
   * @return
   */
  public Object getData();
  /**
   * 设置结点数据域
   *
   * @param obj
   */
  public void setData(Object obj);
}

单链表结点定义

package com.wjy.Data_Structure.linearlist.common;
//单链表结点定义
public class SLNode implements Node {
  private Object element;
  private SLNode next;
  public SLNode() {
  }
  public SLNode(Object ele, SLNode next) {
    this.element = ele;
    this.next = next;
  }
  public SLNode getNext() {
    return next;
  }
  public void setNext(SLNode next) {
    this.next = next;
  }
  /******** Methods of Node Interface **********/
  @Override
  public Object getData() {
    return element;
  }
  @Override
  public void setData(Object obj) {
    element = obj;
  }
}

线性表的单链表实现

在使用单链表实现线性表的时候,为了使程序更加简洁,我们通常在单链表的前面添 加一个哑元结点,也称为头结点。在头结点中不存储任何实质的数据对象,其 next 域指向 线性表中 0 号元素所在的结点,头结点的引入可以使线性表运算中的一些边界条件更容易处理。

package com.wjy.Data_Structure.linearlist.listslinkimpl;
import com.wjy.Data_Structure.linearlist.common.DefaultStrategy;
import com.wjy.Data_Structure.linearlist.common.List;
import com.wjy.Data_Structure.linearlist.common.SLNode;
import com.wjy.Data_Structure.linearlist.common.Strategy;
import com.wjy.Data_Structure.linearlist.exception.OutOfBoundaryException;
//线性表的单链表实现
public class ListSLinked implements List {
  private Strategy strategy; // 数据元素比较策略
  private SLNode head; // 单链表首结点引用
  private int size;// 线性表中数据元素的个数
  public ListSLinked() {
    this(new DefaultStrategy());
  }
  public ListSLinked(Strategy strategy) {
    this.strategy = strategy;
    head = new SLNode();
    size = 0;
  }
  /**
   * 辅助方法: 获取数据元素 e 所在结点的前驱结点
   *
   * @param e
   * @return
   */
  private SLNode getPreNode(Object e) {
    SLNode p = head;
    while (p.getNext() != null)
      if (strategy.equal(p.getNext().getData(), e))
        return p;
      else
        p = p.getNext();
    return null;
  }
  /**
   * 辅助方法: 获取序号为 0<=i<size 的元素所在结点的前驱结点
   *
   * @param i
   * @return
   */
  private SLNode getPreNode(int i) {
    SLNode p = head;
    for (; i > 0; i--)
      p = p.getNext();
    return p;
  }
  /**
   * 辅助方法: 获取序号为 0<=i<size 的元素所在结点
   *
   * @param i
   * @return
   */
  private SLNode getNode(int i) {
    SLNode p = head.getNext();
    for (; i > 0; i--)
      p = p.getNext();
    return p;
  }
  @Override
  public int getSize() {
    return size;
  }
  @Override
  public boolean isEmpty() {
    return size == 0;
  }
  @Override
  public boolean contains(Object e) {
    return indexOf(e) != -1;
  }
  @Override
  public int indexOf(Object e) {
    SLNode p = head.getNext();
    int index = 0;
    while (p != null)
      if (strategy.equal(p.getData(), e)) {
        return index;
      } else {
        index++;
        p = p.getNext();
      }
    return -1;
  }
  @Override
  public void insert(int i, Object e) throws OutOfBoundaryException {
    if (i < 0 || i > size)
      throw new OutOfBoundaryException("错误,指定的插入序号越界");
    SLNode p = getPreNode(i);
    SLNode q = new SLNode(e, p.getNext());
    p.setNext(q);
    size++;
    return;
  }
  @Override
  public boolean insertBefore(Object obj, Object e) {
    SLNode p = getPreNode(obj);
    if (p != null) {
      SLNode q = new SLNode(e, p.getNext());
      p.setNext(q);
      size++;
      return true;
    }
    return false;
  }
  @Override
  public boolean insertAfter(Object obj, Object e) {
    SLNode p = head.getNext();
    while (p != null)
      if (strategy.equal(p.getData(), obj)) {
        SLNode q = new SLNode(e, p.getNext());
        p.setNext(q);
        size++;
        return true;
      } else {
        p = p.getNext();
      }
    return false;
  }
  @Override
  public Object remove(int i) throws OutOfBoundaryException {
    if (i < 0 || i >= size)
      throw new OutOfBoundaryException("错误,指定的删除序号越界。");
    SLNode p = getPreNode(i);
    Object obj = p.getNext().getData();
    p.setNext(p.getNext().getNext());
    size--;
    return obj;
  }
  @Override
  public boolean remove(Object e) {
    SLNode p = getPreNode(e);
    if (p != null) {
      p.setNext(p.getNext().getNext());
      size--;
      return true;
    }
    return false;
  }
  @Override
  public Object replace(int i, Object e) throws OutOfBoundaryException {
    if (i < 0 || i >= size)
      throw new OutOfBoundaryException("错误,指定的序号越界。");
    SLNode p = getNode(i);
    Object obj = p.getData();
    p.setData(e);
    return obj;
  }
  @Override
  public Object get(int i) throws OutOfBoundaryException {
    if (i < 0 || i >= size)
      throw new OutOfBoundaryException("错误,指定的序号越界。");
    SLNode p = getNode(i);
    return p.getData();
  }
}

简单的测试用例

package com.wjy.Data_Structure.linearlist.listslinkimpl;
import org.junit.Test;
import com.wjy.Data_Structure.linearlist.listslinkimpl.ListSLinked;
public class ListSLinkedTest {
  @Test
  public void testInsert() {
    ListSLinked list = new ListSLinked();
    for (int i = 0; i < 10; i++) {
      list.insert(i, i + 1);
    }
    System.out.println("删除:" + list.remove(0));
    System.out.println(list.contains(1));
    list.insertBefore(2, 100);
    list.insertAfter(2, 101);
    list.replace(list.getSize() - 1, 1000);
    for (int i = 0; i < list.getSize(); i++) {
      System.out.println(list.get(i));
    }
  }
}

数据结构学习代码仓库:

https://git.oschina.net/wjyonlyone/DataStructure

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!


# Java  # 数据结构  # java实现线性表及其算法  # java 线性表接口的实例详解  # java线性表的存储结构及其代码实现  # Java数据结构之线性表  # java线性表排序示例分享  # Java实现线性表的链式存储  # 链表  # 线性表  # 链式  # 多个  # 而在  # 种方法  # 更容易  # 中不  # 即用  # 增加了  # 有两个  # 这种方法  # 在每个  # implements  # SLNode  # element  # private  # obj  # param 


相关文章: 唐山网站制作公司有哪些,唐山找工作哪个网站最靠谱?  如何用PHP快速搭建CMS系统?  c# Task.ConfigureAwait(true) 在什么场景下是必须的  如何在云主机快速搭建网站站点?  建站之星五站合一营销型网站搭建攻略,流量入口全覆盖优化指南  香港服务器租用费用高吗?如何避免常见误区?  相亲简历制作网站推荐大全,新相亲大会主持人小萍萍资料?  如何通过免费商城建站系统源码自定义网站主题与功能?  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  C#如何在一个XML文件中查找并替换文本内容  深圳网站制作的公司有哪些,dido官方网站?  建站10G流量真的够用吗?如何应对访问高峰?  简单实现Android文件上传  香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  Python文件管理规范_工程实践说明【指导】  正规网站制作公司有哪些,目前国内哪家网页网站制作设计公司比较专业靠谱?口碑好?  台州网站建设制作公司,浙江手机无犯罪记录证明怎么开?  如何在IIS服务器上快速部署高效网站?  如何在Windows 2008云服务器安全搭建网站?  深圳防火门网站制作公司,深圳中天明防火门怎么编码?  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  免费网站制作appp,免费制作app哪个平台好?  c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】  如何快速搭建二级域名独立网站?  电商网站制作公司有哪些,1688网是什么意思?  用v-html解决Vue.js渲染中html标签不被解析的问题  七夕网站制作视频,七夕大促活动怎么报名?  C#怎么使用委托和事件 C# delegate与event编程方法  建站之星如何助力企业快速打造五合一网站?  微课制作网站有哪些,微课网怎么进?  北京的网站制作公司有哪些,哪个视频网站最好?  网站制作多少钱一个,建一个论坛网站大约需要多少钱?  宝塔Windows建站如何避免显示默认IIS页面?  如何通过可视化优化提升建站效果?  代刷网站制作软件,别人代刷火车票靠谱吗?  东莞专业制作网站的公司,东莞大学生网的网址是什么?  岳西云建站教程与模板下载_一站式快速建站系统操作指南  在线流程图制作网站手机版,谁能推荐几个好的CG原画资源网站么?  建站之星IIS配置教程:代码生成技巧与站点搭建指南  教育培训网站制作流程,请问edu教育网站的域名怎么申请?  公司网站的制作公司,企业网站制作基本流程有哪些?  ,怎么用自己头像做动态表情包?  如何快速搭建虚拟主机网站?新手必看指南  微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?  Python多线程使用规范_线程安全解析【教程】  开源网站制作软件,开源网站什么意思?  北京专业网站制作设计师招聘,北京白云观官方网站?  C++中引用和指针有什么区别?(代码说明)  北京建设网站制作公司,北京古代建筑博物馆预约官网?  建站之星安装模板失败:服务器环境不兼容? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。