java中的链表和 c/c++ 一样,也是一种线性数据结构。和数组的功能有一定的相似,但是两者之间在某些方面还是存在很大的不同,简单的来说不同点有以下几点:
1.在创建数组时,是一次性地开辟一整块内存空间,所有数组元素都是放在里面,必须说明数组的固定长度。而链表可以先创建一个链表头(实际就是第一个结点),在需要的时候动态地添加(扩展链表)
2.数组的数据是按照元素顺序连续地存储在内存中的,定位数组中的数据只要知道其在数组中的位置就行。链表是以结点为单位的,在存储数据时并不是连续存放的,除却数据外,还另外包含指向下一节点的指针,访问数据时总是需要从链表头开始
3.对数组元素进行插入,删除,修改时需要对数组元素进行大规模的移动,而链表避免了这样的情况。
链表是以结点为单位的,我们需要首先定义声明链表中的结点类
class Node{//先建立一个节点类
private int m_Data;
private Node m_Next;
Node(int data){//只有一个节点
m_Data=data;
m_Next=null;
}
Node(int data,Node next){//包含多个节点,必须定义指针
m_Data=data;
m_Next=next;
}
int getData(){
return m_Data;
}
void setData(int data){
m_Data=data;
}
Node getNext(){
return m_Next;
}
void setNext(Node next){
m_Next=next;
}
}
以下是一些关于创建链表,遍历链表,插入,删除链表相关结点的操作:
class Linklist{
Node m_FirstNode;//定义第一个节点
Linklist(){
m_FirstNode=null;
}//第一个构造函数,第一个节点就是为空的,说明是个空链表
Linklist(int data){
m_FirstNode=new Node(data);
}//建立一个只有一个节点的链表,因为没有声明指针
String visitAllNode(){
Node next=m_FirstNode;
String s="";
while (next!=null){
s=s+next.getData();
next=next.getNext();
}
return s;
}//遍历所有的节点,定义声明next是为了不影响第一个节点
void insertAfterId(int data,int id){
Node next =m_FirstNode;
if(next==null){
m_FirstNode=new Node(data);
}
else
{
while(next.getNext()!=null&&next.getData()!=id)
next=next.getNext();
next.setNext(new Node(data,next.getNext()));
}
}//在指定的id位置上插入
boolean removeAtId(int id){
Node ahead=m_FirstNode;
Node follow=ahead;
if(ahead==null)
return false;
else if(ahead.getData()==id)
{
m_FirstNode=m_FirstNode.getNext();
return true;
}
else{
ahead=ahead.getNext();
while(ahead!=null){
if(ahead.getData()==id){
follow.setNext(ahead.getNext());
return true;
}
follow=ahead;
ahead=ahead.getNext();
}
return false;
}
}
void removeAll(){
m_FirstNode=null;
}
}