1.链表简介
链表是一种线性表数据结构。它使用一组任意的存储单元,可以连续可以不连续,来存储一组相同类型的数据。
以单链表为例:
可以看出,一个链表是由多个节点连接组成。每个节点不仅需要存放数据的值,还有要存放一个后续节点的地址 ,即后继指针。
优点:
存储空间不用事先分配,在需要存储空间时,可以直接进行添加元素。在移动,插入,删除元素等操作的时间效率比数组高
缺点:
链表占用的空间大,并且需要访问元素时的时间效率不如数组,因为数组可以随机访问,而链表只能遍历
2.链表的基本操作
链表的基本操作基本是:增,删,改,查
定义一个链表类:
首先,链节点的结构定义:
public class Node {
int data;
Node next;
Node(int data){
this.data=data;
}
Node (int data ,Node next){
this.data=data;
this.next=next;
}
链表的定义:
public class List {
private int size;
private Node head;
}
链表的增加:
有三种方式:头插法,尾插法,中间插入;
头插法,就是在链表第一个节点前插入节点
public void headInsert(int data){
Node node=new Node(data);
if (size != 0) {
node.next = head;
head=node;
size++;
}else {
head=new Node(data);
size++;
}
}
中间插入:
public void insertByIndex(int index,int data){
if(size==0){
System.out.println("链表为空,无法插入");
} else if (index<0||index>size) {
System.out.println("索引不正确");
} else if (index==0) {
headInsert(data);
}else{
Node node=new Node(data);
Node pre=head;
for(int i=0;i<index-1;i++)
{
pre=pre.next;
}
node.next=pre.next;
pre.next=node;
size++;
}
}
尾插法:就在全部元素后面添加
public void tailInsert(int data){
insertByIndex(size,data);
}
链表中查找元素
在链表中查找某个元素的位置,只能从头节点开始,一个一个逐步从查找,找到则返回该节点的地址,否则返还null
public Node find(int data) {
Node n = head;
while (n != null) {
if(n.data == data) {
return n;
}
n = n.next;
}
return null;
}
链表中删除元素
public void delete(int data){
if(head.data==data){
Node n=head;
head=head.next;
n.next=null;
size--;
}else{
Node pre=head;
while(pre.next!=null){
if(pre.next.data==data){
Node n=pre.next;
pre.next=n.next;
n.next=null;
size--;
break;
}else{
pre=pre.next;
}
}
}
}
链表中改变元素的值:
public void change(int index,int data){
if (index>=0&&index<size) {
Node n=head;
for(int i=0;i<index;i++){
n=n.next;
}
n.data=data;
}else {
System.out.println("索引错误");
}
}