一.链表与数组的区别
数组:
1)需要一块连续的内存空间,定义之后,长度不可变
2)数组根据下标来操作,在添加/获取数据时比较快
3)数组在插入/移除数据时,其后的元素下标全部需要改变,会比较麻烦
链表:
1)不需要连续的内存空间,通过节点相连,长度可变
2)插入/移除数据比较快,头/尾添加数据比较快
二.链表与节点
1)n个节点连接成一个链表,一个节点由指针域和数据域构成
2)链表用于管理节点
三.节点类
class Node <E>{
private Object data;
private Node<E> next;
//构造方法
public Node(E data, Node<E> next) {
this.data = data;
this.next = next;
}
//get/set方法
public Object getData() {
return data;
}
public void setData(E data) {
this.data = data;
}
public Node<E> getNext() {
return next;
}
public void setNext(Node<E> next) {
this.next = next;
}
get/set方法
当当前类的属性是private时,要想在其他的类中使用这个属性,那么就需要一个public的get/set方法,用于得到这个属性的值及赋给这个属性值
四.链表类中的常用方法
1)addLast
红色框框是Linkedlist所存储的东西,黑色框框表示一个个节点
root表示头节点,last表示尾节点
当代码中出现new Node()时,就会出现一个新的黑色的框框
新节点做尾节点
public class MyLinkedList <E> {
//泛型的使用
Node<E> root;
//头节点
Node<E> last;
//尾节点
int size;
public void addLast(E e){
if (e==null){
throw new NullPointerException("e==null!!");
}
//root为空,对root进行初始化
if(root==null){
root=new Node<>(e,null);
last=root;
//last也需要记录
size++;
}
else{
last.setNext(new Node<>(e,null));
//设置原节点的next即指针域,并创建一个新的节点存储添加进来的数据值
last=last.getNext();
//更新linkedlist中last的地址
size++;
}
}
2)addFirst
新节点做头节点
public void addFirst(E e){
if (e==null){
throw new NullPointerException("e==null!!");
}
//root为空,对root进行初始化
if(root==null){
root=new Node<>(e,null);
size++;
}
else{
Node<E> node=new Node<>(e,root);
root=node;
size++;
}
}
3)add(插入)
这个方法的插入情况如下
index=1时,
list1中有{AAA,BBB,WWW,CCC,DDD}
index=3时,
list1中有{AAA,BBB,CCC,DDD,WWW}
public void add(int index,E e){
if(index<0||index>=size){
throw new IndexOutOfBoundsException("index is out!!");
}
if (e==null){
throw new NullPointerException("e==null!!");
}
//root为空,对root进行初始化
if(root==null&&index==0){
root=new Node<>(e,null);
last=root;
size++;
return;
}
Node<E> temp=root;
int count=0;
//获取到root里边的值,但是保留root自身
while (count<index){
count++;
temp=temp.getNext();
//迭代替换temp
}
Node<E> next=temp.getNext();
temp.setNext(new Node<>(e,next));
size++;
}
打印链表的数据
public String toString(){
String datastr="{";
Node<E> temp=root;
while (temp.getNext()!=null){
datastr+=temp.getData()+",";
temp=temp.getNext();
}
datastr+=temp.getData()+"}";
return datastr;
}
在主程序中调用toString方法后得到字符串,打印出字符串即可