Java数据结构--ArrayList、链表、队列、栈(二)

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
    }

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值