52.Java 数据结构——线性表
Posted 吉士先生
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了52.Java 数据结构——线性表相关的知识,希望对你有一定的参考价值。
线性表
- 1.什么是线性表?
- 2.线性表的定义:
- 3.线性表图解:
- 4.线性表的长度:
- 5.线性表的顺序储存结构:
- 6.顺序存储结构的全部用法:(ArrayList)
- 7.单链表的全部用法
- 8.循环链表(双指针快慢)
- 9.双向链表:
- 9.双向链表的全部用法
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!=nulJava数据结构(线性表)--线性表 & 线性表和数组的关系
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 数据结构——线性表的主要内容,如果未能解决你的问题,请参考以下文章