链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn)和O(1)。
链表的构建:
构建内部类:
private class Note{
public E e;
public Note next;
}
第一步:创建节点对象
Note first =new Note();
Note second=new second();
Note third =new Third();
第二步:对数据e和对象的引用next赋值
first.e="a";//假设此时泛型E为字符串String类型
second.e="b";
third.e="c";
//将链表串联起来
first.next=second;
second.next=third;
third.next=null;//此时为最后一个元素,默认初始值为null
向链表中添加元素(表头、表中、表尾)
1.向表头添加元素
主要思想:首先新建一个节点(Note)对象newNote,将first节点暂时赋给newNote,并将newNote的对象引用指向first,最后将fist赋值给newNote。实现代码如下:
Note newNote=new Note(e);
newNote.next=first;
newNote=first;
2.向表中添加元素
主要思想:首相创建一个新的节点对象(newNote),获取到需要插入的对应位置的前一个节点prev和prev所指向的下一个节点对象prev.next,将newNote.next指向prev.next,prev.next指向newNote。代码实现如下:
Note newNote=new Note(e);
newNote.next=prev.next;
prev.next=newNote;
3.向表尾添加元素
主要思想:同理创建一个新的节点对象newNote,将原先的最后一个节点third暂时赋给newNote,并将third.next指向newNote,最后将third赋值给newNote(这里third也可以改为last,表示链表的最后一个节点),代码实现如下:
Note newNote=new Note(e);
third.next=newNote;
newNote=third;
链表具体底层实现如下:
public class LinkedList<E>{
private class Note{
public E e;
public Note next;
public Note(E e,Note next){
this.e=e;
this.next=next;
}
public Note(E e){
this(e,null);
}
public Note(){
this(null,null);
}
public String toString(){
return e.toString;
}
}
private Note heard;
public int size;
public LinkedList(){
heard=null;
size=0;
}
public int getSize(){
return size;
}
public boolean isEmpty(){
return size==0;//或者note.next==null
}
//在表头添加元素
public void addFirst(E e){
Note note=new Note(e);
note.next=heard;
note=heard;
size++
}
//在链表的任意位置添加元素
public void add(int index,E e){
if(index<0||index>size){
throw new IllegalArgumentException("添加失败,不合法!");
}
if(index==0){
addFirst(e);
size++;
}
else{
Note prev=heard;
for(int i=0;i<index-1;i++){
prev=prev.next;
}
Note note=new Note(e);
note.next=prev.next;
prev.next=note;
size++;
}
}
//在链表末尾添加元素
public addLast(E e){
add(size,e);
size++;
}
}