链表的定义:
我们都知道数组是用来存储某种数据类型的数据的,那么链表其实也是一样,用来存储某种数据类型的数据的,在Java中也可以是某个对象,链表这种数据结构,用起来他有自己的特点,我们都知道,数组在内存中是一块连续的存储空间,数组的长度也是固定的,那么在对数据进行操作的时候,比如我要在数组中间插入一个元素,那么在空间足够的情况下,后面的每一个元素都要向后移动,这样是不是很麻烦?就好比在医院排着一个很长的队,如果某个人插在中间去,那么后面的人是不是都要退一步?那么链表这种数据结构,就很完美的解决了这一问题。
链表在内存中的存储形式:
它在内存中可以不用是连续的,但是它不是简单存储一个元素,它除了存储本身的数据以外,还需要存储后续的存储位置,这样的一个小单位我们称之为节点。
象这样由n个节点形成的一个线性表我们就称之为链表。
链表的基本操作:
public void createNewNode(int a) //创建一个链表节点
public boolean deleteEle(int i) //删除一个节点
public boolean insertEle(int i, int data) //在任意位置插入一个元素
public void printList() //遍历整个链表
如何读取链表中的元素:
在链表中并没有下标,只能靠头指针来操作整个链表,链表的尾节点指针域为空。
代码:
public void printList(){
Node tem = head;
while(tem != null){
System.out.print(tem.d+"..");
tem = tem.next;
}
System.out.println();
}
链表中创建一个节点:
这里采用的是头插法,只需要把头指针赋给新节点的指针域,然后使头指针指向新节点。
代码:
public void createNewNode(int a){ //创建节点
Node n = new Node(a); //创建一个新的节点
n.next = head; //头节点默认是空的,第一次调用就默认成为了尾节点,这里使用的是头插法
head = n;
size++;
}
删除指定节点:
这里需要我们需要使用一个辅助指针变量,因为在进行删除的时候,需要把当前节点的指针域赋给前一个节点的指针域就可以实现了。
代码:
public boolean deleteEle(int i){
if(i < 0 || i > size){
return false;
}
Node Temp = head;
Node CurrNode = Temp.next;
if(CurrNode == null){
head = null;
size--;
return true;
}
int j =1;
while(CurrNode != null){
if(j == i){
Temp.next = CurrNode.next;
CurrNode.next = null;
size--;
return true;
}
Temp = CurrNode;
CurrNode = CurrNode.next;
j++;
}
return false;
}
/在任意位置插入一个元素:
这里需要注意的是,需要把下一个节点的地址保存下来,不然链表容易断,找不到后面的节点。
代码:
public boolean insertEle(int i, int data){
if(i < 1 || i > size){
return false;
}
int j = 1;
if(i == 0){
Node n = new Node(data);
n.next = head;
head = n;
size++;
}
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;
size++;
return true;
}
CurrNode = CurrNode.next;
j++;
}
return false;
}