java数据结构之链式线性表的实现

线性表线性表的相关概念:pbulic class SingleLinkNode<T> { public T data; public SingleLinkNode next; pulbic SingleLinkNode(){ super(); } public SingleLinkNode(T t){ this.data = t ; this.next= nu...
摘要由CSDN通过智能技术生成

链式线性表

线性表的相关概念:
链式线性表的定义:用一组任意的存储单元存储线性表的数据元素,这里的存储单元可以是连续也可以是不连续的。

特点:

  1. 存在唯一的可以被称为“第一个”的数据元素
  2. 存在唯一的可以被称为“最后一个”的数据元素
  3. 除了第一个元素之外,每个元素都只有一个唯一的前驱
  4. 除了最后一个元素之外,每个元素都只有一个唯一的后继

线性表可以用数组和链表实现,笔记中主要记录如何用用链表区实现线性表的。
线性链表:是用链表实现的线性表,链表中的每一个存储单元称之为结点。每一个结点中只有一个指针域的结点的称之为单链表;在单链表中链表的尾部指向头部的称之为循环链表;每个结点中有两个指针域的称之为双链表
结点:由数据域指针域组成,数据域用于存放数据,指针域用于指向(前驱)后继的元素,即(上)下一个结点。

1、单向链表的实现

1.1、单链表的节点实现:

  • 定义一个数据域用于存放数据,在这里使用到了泛型
  • 定义一个指针域用于存放后继的结点位置

备注:这里可以使用 datanext 这两个成员属性定义为私有,即使用 private 修饰,提供相应的 getset 方法。

 class SingleLinkNode<T> {
   
 	// 数据域:用于存放数据
	public T data;
	// 指针域:用于指向后继的元素,即下一个结点
	public SingleLinkNode next;
	// 构造方法
	pulbic SingleLinkNode(){
   
		super();
	}
	public SingleLinkNode(T t){
   
		this.data = t ;
		this.next= null;
	}
	
}

1.2、单链表的实现
本次实现中已将 SingleLinkNode 作为SingleLink内部类,所以无需再提供额外的 SingleLinkNode 类。

public class SingleLink<T>{
   
    // 创建一个头指针
    private SingleLinkNode head;
    public SingleLink(){
   
        head = new SingleLinkNode();
        this.head.data = null;
        this.head.next = null;
    }
    // 获取线性表的长度
    public int size(){
   
        SingleLinkNode temp = head;
        int size = 0 ;
        while(temp.next != null){
   
            temp = temp.next;
            size++;
        }
        return size;
    }
    // 清空线性表
    public void clear(){
   
        // 将链表的头指针置空即可
        this.head.next = null;
    }
    // 获取指定链表中的数据
    public Object get(int index){
   
        // 判断获取的位置是否合理
        int size = this.size();
        if(index < 0 || index >= size){
   
            throw new RuntimeException("获取的位置不合理!");
        }
        //创建临时变量
        //将index定位到指定元素第一次出现的位置
        SingleLinkNode temp = locateNode(index);
        //返回节点中的数据
        return temp.data;
    }
    // 定位到data第一次出现的位置
    public int locate(T data){
   
        int index = -1;
        int tempIndex = 0;
        SingleLinkNode temp = head.next;
        while(temp != null){
   

            if(data.equals(temp.data)){
   
                index = tempIndex;
                break;
            }
            temp = temp.next;
            tempIndex++;
        }
        // 如果返回的是-1,则代表没有找到
        return index;
    }

    //返回到data第一次出现的节点
    private SingleLinkNode locateNode(int index){
   
        SingleLinkNode temp = head;

        while(index >= 0){
   
            temp = temp.next;
            index--;
        }
        return temp;

    }

    // 添加数据,没有指定的位置的话,默认在队列的尾部插入
    public void add(T data){
   
        // 判断加入的数据是否为空
        if(data == null){
   
            throw new RuntimeException("插入的数据不能为空");
        }
        SingleLinkNode insertNode = new SingleLinkNode(data) ;
        SingleLinkNode temp = this.head;
        while(temp.next != null){
   
            temp = temp.next;
        }
        insertNode.next =null;
        temp.next = insertNode;
    }
    // 重载add方法,在index位置上插入的数据,index和数组索引一样从 0 开始
    public void add(int index,T data){
   
        // 判断插入的位置是否合理
        if(index <0 || index >this.size()){
   
            throw new RuntimeException("插入的位置不合理")
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值