1.数据结构的概念
数据:信息载体,计算机处理的对象的总称
数据元素:也称结点,组成数据的基本单位
数据项:数据项是数据的最小单位
2.线性结构:
有且仅有一个开始节点和一个终端节点,所有节点最多只有一个直接前驱和一个直接后继
3.复杂度
复杂度是衡量一个算法好坏的重要手段,分为时间复杂度和空间复杂度,时间复杂度是以一个算法执行时间长短来衡量算法优劣的,如果问题的规模为n,则时间复杂度是n的一个函数:记作T(n)=O(f(n));
空间复杂度,他以一个算法执行过程中所要占用的存储空间的多少来衡量一个算法的优劣,他是问题规模n的一个函数,记作S(n)=O(f(n))
要找到第i个位置就要历遍前i个元素,插入就要把剩下的元素全部后移,所以历便了所有的元素,时间复杂度为O(n),同理删 除第i个元素的道理也是一样的,时间复杂度为O(n)线性表的存储结构,但是要访问的话就是O(1).
4.线性表
线性表是由n(n>=0)个数据元素组成的有限的序列
1.有且仅有一个开始节点
2.有且仅有一个终结节点
3.内部节点都有且仅有一个直接前驱和一个直接后继
5.java代码实现线性表的顺序存储
线性存储几乎不浪费地址空间
创建一个LinearList 接口,包含了线性表的基本功能
package com.wx.datastructure.base;
public interface LinearList {
//接口中的变量都是static final的
public int size();//返回线性表长度的大小
public boolean isEmpty();//判断线性表是否为空
public void add(int index,Object element);//指定位置插入元素
public void add(Object element);//在线性表的末尾添加元素
public void remove(Object elementm);//移除指定位置的元素
public void clear();//清空链表
public Object get(int index); //根据链表下标返回元素
}
实现这个接口:
package com.wx.datastructure.baseimp;
import com.wx.datastructure.base.LinearList;
public class WxArrList implements LinearList {
//顺序存储的链表底层用数组来实现
private Object[] objectlist;
//默认初始的链表的长度10,这个10外部看不到
private int size;
//链表的当前位置
private int current=0;
public WxArrList()
{
//如果初始化不指定list的长度,list的长度则为10
this(10);
}
public WxArrList(int size)
{
//初始化指定list的长度
if(size>0)
{
this.size=size;
objectlist=new Object[size];
}
if (size==0)
{
objectlist=new Object[10];
}
//否则抛出异常,初始化参数不合法
}
/*
返回链表长度的大小
*/
@Override
public int size() {
//这个长度是此时链表中实际装有元素的多少
return this.current;
}
/*
判断链表是否为空
*/
@Override
public boolean isEmpty() {
if (this.current==0)
{
return true;
}
return false;
}
/*
向指定位置添加元素
*/
@Override
public void add(int index, Object element) {
if(index>size&&index<0)
{
throw new IndexOutOfBoundsException("index"+index);
}
//先对链表进行扩容,再往后移动,再实现插入的操作
//先判断数组是否已经满了,满了就扩容
if(current+1>this.size-1)
{
size++;
Object[] temp=new Object[size];
for(int i=0;i<=objectlist.length-1;i++)
{
temp[i]=objectlist[i];
}
objectlist=null;
objectlist=temp;
}
//把index后的元素往后挪动一位
for (int i=current-1;i>=index;i--)
{
objectlist[i+1]=objectlist[i];
}
//index位置插入元素
objectlist[index]=element;
current++;
}
/*
在链表的尾部添加元素
*/
@Override
public void add(Object element) {
//初始的数组的大小为10或为自己指定的数,如何实现添加元素的功能
//先判断当前数组是否满了,满了就扩容,每次的增量为1
if (current>this.size-1)
{
this.size=size+1;
Object[] temp=new Object[this.size];
for (int i=0;i<current;i++)
{
temp[i]=objectlist[i];
}
objectlist=null;
objectlist=temp;
}
objectlist[current]=element;
current++;
}
@Override
public void remove(Object elementm) {
}
@Override
public void clear() {
}
/*
根据链表下标来访问元素
*/
@Override
public Object get(int index) {
if(index>=0&&index<=this.size)
{
return objectlist[index];
}
return null;
}
}
测试类:
package com.wx.datastructure.test;
import com.wx.datastructure.baseimp.WxArrList;
public class TestWxList {
public static void main(String[] agrs)
{
WxArrList wxArrList=new WxArrList(2);
wxArrList.add(9);
wxArrList.add(0,0);
wxArrList.add(1,1);
wxArrList.add(1,2);
System.out.print("链表的长度:"+wxArrList.size());
System.out.print(" ");
System.out.print(wxArrList.get(0));
System.out.print(wxArrList.get(1));
System.out.print(wxArrList.get(2));
System.out.print(wxArrList.get(3));
}
}
执行结果: