自己动手实现集合框架类(二)之LinkedList

LinkedList相比于ArrayList的底层实现区别是,Linkedlist的底层为一个双向链表,而不是数组了。

画个丑图表示下:
这里写图片描述

在linkedList的底层实现中,存储一个表头first节点指向链表的第一个节点,存储一个last节点,指向链表的最后一个节点,而每个节点又存储了一个指向其前一个节点(previous)和后一个节点(next)的指针。

Node节点的表示:

package com.java.myutil;

public  class Node {
    Object element;
    Node next;
    Node previous;

    Node(Object element, Node next, Node previous) {
        this.element = element;
        this.next = next;
        this.previous = previous;
    }
}

LinkedList的实现:

package com.java.myutil;

//链表的结构

public class LinkedList implements Collection{

    private int size=0;

    private Node first;//表头
    private Node last;//表尾

    //往链表中添加元素
    public void add(Object object) {

      Node l=last;
      //往表尾插入元素,则新节点的previous指向的last,next指向空
      Node newNode=new Node(object,null,last);
      //重新将表尾赋值为新建的节点
      last = newNode;
      //如果原始链表为空,则头结点赋值为新建的节点
      if (l == null)
          first = newNode;
      else//否则,原来的尾节点的next指向新节点
          l.next = newNode;
      size++;   
    }
    //链表中删除元素
    public void remove(Object object){
        for (Node node = first; node!=null; node=node.next) {
            if (node.element.equals(object)) {

                //删除是第一个节点
                if (node.previous==null) {
                    first=node.next;
                }else {
                    node.previous.next=node.next;   
                    node.previous=null;
                }
                //删除的是最后一个节点
                if (node.next==null) {
                    last=node.previous;

                }else{
                    node.next.previous=node.previous;
                    node.next=null;

                }
                node.element=null;
                size--;
            }
        }

    }
    //遍历链表,拿i位置的元素
    public Object get(int i) {
        Node n= first;
        for (int  index = 0; index < i; index++) {

            n=n.next;       
        }
        return   n.element;

    }

    public int size() {
        return size;
    }

    public Iterator iterator() {
        return new LinkedListIterator();
    }
    //迭代器的实现
    private class LinkedListIterator implements Iterator{

        private int index=0;
        private Node node=first;//指向头结点
        private Node lastReturned;//指向上一次操作的node

        public boolean hasNext() {
            return index!=size;
        }

        public Object Next() {

            lastReturned=node;
            index++;
            node=node.next;
            return lastReturned.element;

        }

        public void remove() {
            Node  lastNext=lastReturned.next;
            //调用LinkedList的remove(Object o)方法
            LinkedList.this.remove(lastReturned.element);
            //下面注释的代码,以后要是实现previou方法,就需要,暂时不写
            //if (node==lastReturned)
           // node = lastNext;
           //  else
             index--;
             lastReturned=first;

        }


    }

    public static void main(String[] args) {
        LinkedList linkedList=new LinkedList();
        linkedList.add("aa1");
/*      linkedList.add("bb2");
        linkedList.add("cc3");
        linkedList.add("dd4");*/

        Iterator it=linkedList.iterator();
        while (it.hasNext()) {
            System.out.println(it.Next());

        }
        //System.out.println(linkedList.get(3));

      //  linkedList.remove("cc3");

        Iterator it2=linkedList.iterator();
        while (it2.hasNext()) {

            String data =(String )it2.Next();

            if (data.equals("aa1")) {
                it2.remove();
            }

        }
        System.out.print(linkedList);

    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值