1.LinkedList
LinkedList底层是由链表实现的,查询慢增删快。
2.LinkedList基本操作
(1)链表节点
private Entry<T> headEntry;
private Entry<T> tailEntry;//标记尾部
(2)头部添加
public void addHead(T value){
Entry<T> p = new Entry<>(value);
//空链表
if(headEntry == null){
headEntry = p;
tailEntry = p;//标记尾巴
}else {
p.setNext(headEntry);//
headEntry = p;//新链表起始位置
}
}
(3)尾部添加
public void addTail(T value){
Entry<T> newEntry = new Entry<>(value);
if(headEntry == null){
headEntry = newEntry;
tailEntry = newEntry;
}else{
tailEntry.setNext(newEntry);
tailEntry = newEntry;
Entry p;
for(p = headEntry;p.getNext()!=null;p=p.getNext());
p.setNext(newEntry);
}
}
(4)头部删除
public void removeHead(){
if(headEntry == null){
return;
}
headEntry.setValue(null);
headEntry = headEntry.getNext();
if(headEntry==null){
tailEntry = null;
}
}
(5)尾部删除
public void removeTail(){
if(headEntry == null)
return;
if(headEntry.getNext() == null){
headEntry = null;
tailEntry = null;
return;
}
tailEntry.setValue(null);//防止内存泄漏
//找为尾巴前驱
Entry<T> beforeTail = headEntry;
for (;beforeTail.getNext().getNext() !=null;beforeTail=beforeTail.getNext()){
;
}//尾巴前驱
tailEntry = beforeTail;
tailEntry.setNext(null);//新尾部节点next=null
beforeTail.setNext(null);
}
(6)删除元素
public void removeValue(T value){
if(headEntry == null)
return;
if(headEntry.getValue().compareTo(value)==0){
headEntry.setValue(null);//防止内存泄漏
headEntry = headEntry.getNext();
if(tailEntry == headEntry){
tailEntry = null;
}
return;
}
//p保存要删节点的前驱节点
for(Entry<T> p=headEntry;p.getNext()!=null;p=p.getNext()){
if(p.getNext().getValue().compareTo(value)==0){
p.getNext().setValue(null);//防止内存泄漏
p.setNext(p.getNext().getNext());
tailEntry = p;//此时更新新尾巴
break;
}
}
}
(7)输出相交链表节点
private int getLength(){
int count = 0;
for(Entry<T> p = headEntry;p!=null;p=p.getNext()){
count++;
}
return count;
}
public static <E extends Comparable<E>>E getMeetEntry(Link<E>link,Link<E> link2){
//1. 统计出链表长度
int length1 = link.getLength();
int length2 = link2.getLength();
int difference = Math.abs(length1-length2);//长度
//2. 长链表先走差值步
Entry<E> longLinkEntry = length1>length2 ? link.headEntry:link2.headEntry;
Entry<E> shortLinkEntry = length1<=length2 ? link.headEntry:link2.headEntry;
for(;--difference>=0;longLinkEntry=longLinkEntry.getNext()){
;
}
//3.长短链表同时向后走,直到llong == short
for(;longLinkEntry!=null;longLinkEntry=longLinkEntry.getNext(),shortLinkEntry=shortLinkEntry.getNext()){
if(longLinkEntry == shortLinkEntry){
return longLinkEntry.getValue();
}
}
return null;
}
(8)输出倒数第k个节点
public static <E extends Comparable<E>>E show_DK(Link<E> link,int k){
if(k > link.getLength() || k < 0)
return null;
Entry<E> p = link.headEntry;
Entry<E> q = link.headEntry;
for(;--k >= 0;p=p.getNext()){
;
}
//此时p走k步
for(;p!=null;p=p.getNext(),q=q.getNext());
// p == null 此时q走到的位置就是倒数第k步
return q.getValue();
}
(9)单链表逆置
public static <E extends Comparable<E>> void reverse(Link<E> link){
if(link.getLength() == 1){
return;
}
Entry<E> p = link.headEntry,q=p.getNext(),s=q.getNext();
while(q!=null){
q.setNext(p);
p = q;
q = s;
if(s!=null) {
s = s.getNext();
}
}
//原来headEntry是新的尾巴
link.tailEntry = link.headEntry;
//此时p是头
link.headEntry = p;
link.tailEntry.setNext(null);//新尾部next=null
}