52.Java 数据结构——线性表

Posted 吉士先生

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了52.Java 数据结构——线性表相关的知识,希望对你有一定的参考价值。

线性表

1.什么是线性表?

线性表是最基本、最简单、也是最常用的一种数据结构。线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列
线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的(注意,这句话只适用大部分线性表,而不是全部。比如,循环链表逻辑层次上也是一种线性表(存储层次上属于链式存储,但是把最后一个数据元素的尾指针指向了首位结点)。

2.线性表的定义:

线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。数据元素是一个抽象的符号,其具体含义在不同的情况下一般不同。(直接前驱和直接后继)

3.线性表图解:


有限:数据元素是有限个的
序列:小朋友排队是有顺序的.

4.线性表的长度:

线性表的元素个数n就是线性表的长度: 当n=0时,那么就是空表.i称为序列!
线性表的长度不等于数组的长度,通常数组的长度大于等于线性表的长度:

5.线性表的顺序储存结构:

5.1定义:

顺序储存结构:是指的时一段地址连续的储存单元依次存储线性表的数据元素.

5.2顺序储存结构的插入元素:

注意事项:

阐述:

表长+1并不是说数组的长度+1,而是指的时数据元素+1

方法:

public static int[] InsertNumber(int []nums,int idex,int number)
        if(nums.length==5)    //假设数组的最大为5个,假如说表的长度等于5,返回null
            return null;
        
        if(idex==nums.length-1)  //假如说插入元素的下表在线性表中的最后一个,那么就执行下面这样的循环
            nums[idex]=number;    //插入
            return nums;
        
        if(idex<nums.length-1)   //假如说插入元素的下表不是线性表的最后一个,那么就执行一下程序
            for(int k=nums.length-1;k>idex;k--)
                nums[k]=nums[k-1];   //插入元素后的所有元素后退
            
            nums[idex ]=number;   //插入
            return nums;
        
        return null;
    

主函数:

import java.sql.SQLOutput;
import java.util.*;
import java.awt.*;
public class hello 
    public static void main(String []avgs) 

        int []nums=new int[4];
        nums[0]=1;  //线性表
        nums[1]=2;  //线性表
        nums[2]=3;  //线性表
        int []arr=InsertNumber(nums,0 ,5);  //数组 插入坐标 插入元素
        for(int i=0;i<arr.length;i++)    //打印输出
            System.out.println(arr[i]);
        
    

5.3线性表的顺序结构的删除元素:

删除算法的思路:
(1)如果删除位置不合理,抛出异常;(2)取出删除元素;
(3)从删除元素位置开始遍历至到最后一个元素位置,分别将它们都向前移动一个位置;
(4)表长减1。

方法:

  public static int[] InsertNumber(int []nums,int idex)
        if(nums.length==0)    //假设线性表为0
            return null;
        
        if(idex>nums.length)  //假如说删除的数据大于线性表长度
            return null;
        
        if(idex<nums.length)
            for(int k=idex;k<nums.length-1;k++)  //中间条件目的是为了防止线性表超限
            
                nums[k]=nums[k+1];
            
            return nums;
        
        return null;
    

主函数:

import java.sql.SQLOutput;
import java.util.*;
import java.awt.*;
public class hello 
    public static void main(String []avgs) 

        int []nums=new int[4];
        nums[0]=1;  //线性表
        nums[1]=2;  //线性表
        nums[2]=3;  //线性表
        int []arr=InsertNumber(nums,1 );  //数组 插入坐标 插入元素
        for(int i=0;i<arr.length;i++)    //打印输出
            System.out.println(arr[i]);
        
    


*切记哈,删除和插入的是线性表=====并不是数组*

5.4线性表顺序储存结构的优缺点

6.顺序存储结构的全部用法:(ArrayList)

判断是否清空

 public boolean isEmpty()
        return N==0;
    

线性表的长度`

 public int getLength()
        return N;
    

索引所在的值

 public T getNumber(int i)
        return elem[i];
    

在线性表中插入元素

 public void Insert(T t)
        elem[N++]=t;
    

在指定索引i处增加t

 public void add(int idex,T t)
            for(int i=N;i>idex;i--)
                elem[i]=elem[i-1];
            
            N++;
            elem[idex]=t;
        

删除指定索引i的值,并返回删除索引的值

   public T remove(int i)
        T count=elem[i];
        for(int idex=i;idex<N-1;idex++)
            elem[idex]=elem[idex+1];
        
        //元素个数-1
        N--;
        return count;
    

查找元素T,在链表中出现的第一个位置

  public int Find(T t)
        for(int i=0;i<N;i++)
            if(elem[i].equals(t))
                return i;
            
        
        return -1;
    

数组的扩容

  public void resize(int size)
        T [] newelem=(T[]) new Object[size];
        for(int i=0;i<N;i++)
            newelem[i]=elem[i];  //老数组赋值给新数组
        
        elem=newelem;   //新数组赋值给老数组
    

`类方法展示:

public class SquenceList <T>
    private T[]elem;  //定义一个数据类型为T的数组
   //代表线性表中存放的元素个数
    private int N;
    public SquenceList(int capacity) //构造方法
        //初始化数组
        this.elem=(T[])new Object[capacity];
        this.N=0;
    
    //实现对数组的扩容处理
    public void resize(int size)
        T [] newelem=(T[]) new Object[size];
        for(int i=0;i<N;i++)
            newelem[i]=elem[i];  //老数组赋值给新数组
        
        elem=newelem;   //新数组赋值给老数组
    
    //清空线性表
    public void clear()
        N=0;
    
    //判断线性表是否为空
    public boolean isEmpty()
        return N==0;
    
    //求线性表的长度
    public int getLength()
        return N;
    
    //获取索引所在的值:
    public T getNumber(int i)
        return elem[i];
    
    //向线性表中插入元素
    public void Insert(T t)
        elem[N++]=t;
    
    //在指定索引i处增加t
	 public void add(int idex,T t)
            for(int i=N;i>idex;i--)
                elem[i]=elem[i-1];
            
            N++;
            elem[idex]=t;
        
    //删除指定索引i的值,并返回删除索引的值
    public T remove(int i)
        T count=elem[i];
        for(int idex=i;idex<N-1;idex++)
            elem[idex]=elem[idex+1];
        
        //元素个数-1
        N--;
        return count;
    
    //查找元素T,在链表中出现的第一个位置
    public int Find(T t)
        for(int i=0;i<N;i++)
            if(elem[i].equals(t))
                return i;
            
        
        return -1;
    


主方法:

public class SquenceListTest 
    public static void main(String []avgs)
        //创建顺序表对象
        SquenceList<String> s1=new SquenceList<>(10);
        //测试插入
        s1.Insert("李明");
        s1.Insert("傻子");
        s1.Insert("王二" );
        s1.Insert("张三");
        //测试获取
        String result=s1.getNumber(1);
        System.out.println(result);
        //测试删除
        String remove1=s1.remove(1);
        System.out.println("删除的是:"+remove1);
        //测试清空
        s1.clear();
        System.out.println("清空后的元素个数为:"+s1.getLength());
    

7.单链表的全部用法

创建链表结点

 private class Node1    //调用结点类
    T item;    //数据域
    Node1 next;   //指针域

       public Node1(T item, Node1 next) 
           this.item = item;
           this.next = next;
       
   //调用节点类

对链表进行初始化

public LinkedList()  //初始化链表
        this.head=new Node1(null,null);
        this.size=0;
    

//获取指定位置的元素:

public T get(int idex)
    Node1 target=this.head.next;  //获取0结点的指针,且目前表示的是第一个结点

        for(int i=0;i<idex;i++ )   //移动指针
            target=target.next;
        
        return target.item;

//获取指定位置的结点

public Node1 getNode(int idex)
    if(idex==-1)   //目的是在指定位置0的时候的作用
        return head;
    
    Node1 target=this.head.next;
    for(int i=0;i<idex;i++ )   //移动指针
        target=target.next;
    
    return target;

//在尾部添加数据

public void add(T t)
Node1 node=new Node1(t,null);
if(this.size==0)   //假如说是0结点,那么就添加到零结点
    this.head.next=node;
else   //找到最后一个结点
    this.getNode(this.size-1).next=node;

//链表长度++
    this.size++;

//在指定位置插入数据

public void add(int idex,T t)
    //获取需要插入点的节点
    Node1 node2 =new Node1(t,null);
    //获取被插入点的结点
    Node1 current=this.getNode(idex);
    //获取被插入点的前一个为止
    Node1 BeforeCurrent=this.getNode(idex-1);
    //把前一个结点的指针指向插入点
    BeforeCurrent.next= node2;
    //把插入点的指针指向被插入点
    node2.next=current;
    this.size++;

//删除指定位置的结点

  public T remove(int idex)
        //获取删除点的前一个结点
        Node1 before =this.getNode(idex-1);
        //获取删除点的结点
        Node1 current=this.getNode(idex);
        before.next=current.next;
        this.size--;
        return current.item;

    

类文件:



import org.jetbrains.annotations.NotNull;

public class LinkedList<T> 
    Node1 head;  //设置头节点
    int size;   //链表长度

    public LinkedList()  //初始化链表
        this.head=new Node1(null,null);
        this.size=0;
    
    public void reverse2()
        reverse1(this.head.next);
    
    //使用快慢指针寻找中间元素
    public T QuickSlowP()
        //设置慢指针
        Node1 slow=this.head.next;
        //设置快指针
        Node1 quick=this.head.next;
        //设置慢指针计数器:
        int length=0;
        //设置快指针计数器
        int length1=0;
        while(quick!=null)
            //慢指针
            slow=slow.next;
            //快指针
            quick=quick.next;
            quick=quick.next;
            length++;
            length1++;
        
        int mid=length1/2;
        quick=this.head.next;  //这边的node要进行重新初始化
        for(int i=0;i<mid;i++)
            quick=quick.next.next;
        
        return quick.item;
    
    //利用慢指针进行寻找中间元素
    public T Slowp()
        //获取第一个结点的指针
        Node1 node=this.head.next;
        //定义一个链表的长度的计数器:
        int length=0;
        while(node!=nul

Java数据结构(线性表)--线性表 & 线性表和数组的关系

1. 线性表

线性表是一种最常用、最简单、也是一种最基本的数据结构,它是学习其他数据结构的基
础。线性表在计算机中可以用顺序存储和链使存储两种存储结构来表示。其中用顺序存储结
构表示的线性表称为顺序表,用链使存储结构表示的沉稳给链表。链表又有单链表、双向链
表、循环链表之分。

1.1 线性表的定义

有限的数据元素组成的有限序列,通常表示为(a0,a1,...,ai,...,an-1)。
其中下标i标识数据元素在线性表中的位序号,n为线性表的表长,当n = 0的时候,
此线性表是空表。

1.2 线性表的特点

  • 对于同一个线性表,对其每一个数据元素的值可以不相同,但必须具有相同的数据类型
  • 数据元素之间具有一种 线性的 或者 一对一 的逻辑关系
  • 第一个数据元素没有前驱,这个数据元素也称为开始结点(头结点)
  • 最后一个元素没有后继,这个数据元素被称为终端结点(尾结点)
  • 除了第一个元素与最后一个数据元素之外,其他数据元素都有且仅有一个前驱和后继。
  • 线性表是一种线性结构

1.3 线性表的基本操作

在这里插入图片描述


1.4 线性表抽象数据类型的Java接口描述

在这里插入图片描述

在这里插入图片描述

IList.java

package linearTable;

/**
 * ClassName: SequenceTable
 * Description: 线性表抽象数据类型的Java接口描述
 *
 * @author Tianjiao
 * @date 2021/7/4 20:06
 */
public interface IList {
    //     将一个已经已经存在的线性表置为空表
    public void clear();

    //     判断线性表是否为空
    public boolean isEmpty();

    //     求线性表中数据元素的个数并且返回
    public int length();

    //     读取并返回线性表中的第i个数据元素
    public Object get(int i) throws Exception;

    //     在线性表第i个数据元素之前插入一个值为o的数据元素.
    public void insert(int i, Object o) throws Exception;

    //    删除线性表中下标(位序号)中第i个数据元素
    public void remove(int i) throws Exception;

    //    返回线性表中首次出现o的下标(位序号)
    public int indexOf(Object o);

    //    输出线性表中所有的数据
    public void display();
}

1.5 线性表和数组的关系

线性表与数组都是数据结构,只是描述角度不同。线性表是从逻辑结构的角度来说的,它的
每一个元素都只有一个前驱元素和一个后驱元素除了头和尾,逻辑结构还有队列,堆栈,
树,图等。而数组是从物理存贮的角度来说的,线性表可以用数组存储也可以用链表来存
储。同样的队列也可以用数组和链表存储,各有利弊。具体使用时,根据具体情况选择。

数组和线性表在存储方式上没有什么不同,都是顺序存储。即在内存中开辟一块连续的存储空间用于存储数据,所以数据在物理存储位置上是相邻的。



以上是关于52.Java 数据结构——线性表的主要内容,如果未能解决你的问题,请参考以下文章

数据结构与算法之线性表(超详细顺序表链表)

Python数据结构与算法(2.1)——线性表的基本概念

数据结构与算法学习笔记:线性表Ⅰ

数据结构 线性表 用c语言

数据结构与算法线性表的重要基本操作与代码实现C语言版

数据结构与算法分析java——线性表