链式线性表
线性表的相关概念:
链式线性表的定义:用一组任意的存储单元存储线性表的数据元素,这里的存储单元可以是连续也可以是不连续的。
特点:
- 存在唯一的可以被称为“第一个”的数据元素
- 存在唯一的可以被称为“最后一个”的数据元素
- 除了第一个元素之外,每个元素都只有一个唯一的前驱
- 除了最后一个元素之外,每个元素都只有一个唯一的后继
线性表可以用数组和链表实现,笔记中主要记录如何用用链表区实现线性表的。
线性链表:是用链表实现的线性表,链表中的每一个存储单元称之为结点。每一个结点中只有一个指针域的结点的称之为单链表;在单链表中链表的尾部指向头部的称之为循环链表;每个结点中有两个指针域的称之为双链表。
结点:由数据域和指针域组成,数据域用于存放数据,指针域用于指向(前驱)后继的元素,即(上)下一个结点。
1、单向链表的实现
1.1、单链表的节点实现:
- 定义一个数据域用于存放数据,在这里使用到了泛型
- 定义一个指针域用于存放后继的结点位置
备注:这里可以使用 data 和 next 这两个成员属性定义为私有,即使用 private 修饰,提供相应的 get 和 set 方法。
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("插入的位置不合理")