在实现之前首先要知道链表为何存在的?其实链表是由数组转换而来,所谓数组就是用来存储同种数据类型的集合,他在内存中是一块连续的存储空间,如果数组仅用来存和取数据的话,那不得不说是一个很好的东西。但是这往往不能满足人们的需求,数组它的长度是固定的,再对其里面的元素进行操作的时候,很麻烦,所以就诞生了链表。
链表其实就打破了数组的这种局限性,它的长度不是固定的,在内存中也不是一块连续的存储空间,那么链表是靠什么来维持线性关系的呢,那就是通过指针,把一个节点分成两部分,一部分保存数据(数据域),一部分保存下一个节点的地址(指针域),它在内存中的存储形式如下图。
其实在Java中,它的指针域就是存放的该种类,那么该如何来实现代码呢,首先需要一个头指针,然后创建节点
public void createNewNode(int a){
Node n = new Node(a); //创建一个新的节点
n.next = head; //头节点是空的,第一次调用就默认成为了尾节点,这里使用的是头插法
head = n; //然后使头节点指向这里
}
这里使用的是头插法,每调用一次,生成的节点都是在链表的最前端,还有一种尾插法,这里就不详述了。
删除一个节点,
//删除一个节点
public boolean deleteEle(int i){
if(i < 1 || i > Length()){
return false;
}
Node Temp = head;
Node CurrNode = Temp.next;
if(CurrNode == null){
head = null;
return true;
}
int j =1;
while(CurrNode != null){
if(j == i){
Temp.next = CurrNode.next;
CurrNode.next = null;
return true;
}
Temp = CurrNode;
CurrNode = CurrNode.next;
j++;
}
return false;
}
这里首先判断传递进来的参数是否正确,然后使用两个辅助指针变量,判断这是不是只有一个节点,如果是的话,就将它删除,如果不是,就判断,要删除第几个节点,其实基本思想很简单,首先把删除指针的指针域用一个临时变量保存起来,然后赋给前一个节点的指针域就可以了。
在链表的任意位置插入一个元素,我还是首先把基本思想说一下,要在链表中的某一个位置插入一个元素,就需要用一个临时变量,保存你插入元素的后一个节点的位置,然后把要插入节点的地址赋给当前指针的位置,然后再把临时变量赋给新节点的位置。
public boolean insertEle(int i, int data){
if(i < 1 || i > Length()){
return false;
}
int j = 1;
if(i == 1){
Node n = new Node(data);
n.next = head;
head = n;
}
Node CurrNode = head;
Node Tem = null;
while(CurrNode != null){
if(i == j){
Node n = new Node(data);
Tem = CurrNode.next;
CurrNode.next = n;
n.next = Tem;
return true;
}
CurrNode = CurrNode.next;
j++;
}
return false;
}
还有一个就是打印链表和获取链表长度,其实不难,只需要从链表的头节点开始往后遍历就可以了,结束的标志就是最后一个节点的指针域为空。