LinkList

LinkList:java中jdk1.6之后java.util.LinkList 类中对分装链表的理解:

参考:http://www.cnblogs.com/lintong/p/4374292.html

第一部分:熟悉LinkList中哪些方法和其构造;第二部分熟悉使用JDK中LinkList的API接口

第1部分:LinkList 的介绍:

linklist:是一个双向链表,当做堆栈,队列或者双端队列进行操作;当做stack时候只能用push,pop,peek方法;当做队列时候用 add,remove,element方法

实现List接口能对队列操作;实现Deque接口当做双端队列使用;

自己编写的Linklist 与JDK中LinkedList相比较,推荐使用自带的LinkedList

package MyArrayList;

public class MyLinkList <AnyType> implements Iterable<AnyType> {

    //内嵌类node,指向LinkList的头结点(header_node)与尾部结点(tail_node);
    //父亲查看私有类的属性,但是外部不知道有这样私有元素
    private int theSize;
    private int modCount=0;
    private Node<AnyType> beginMaker;
    private Node<AnyType> endMaker;
    private static class Node<AnyType>
    {
        @SuppressWarnings("unused")
        public AnyType data;
        @SuppressWarnings("unused")//你从没有使用这个变量
        public Node<AnyType> prev;
        @SuppressWarnings("unused")
        public Node<AnyType> next;
        //构造函数初始化
        @SuppressWarnings("unused")
        public Node(AnyType data,Node<AnyType>p,Node<AnyType>q)
        {
            this.data=data;
            this.prev=p;
            this.next=q;
        }
    }
    public void cLear()
    {
        //申请Node结点同时初始化,后面建立初始链表
        doClear();
    }
    private void doClear()
    {
         beginMaker=new Node<AnyType>(null,null,null);
         endMaker=new Node<AnyType>(null,beginMaker,null);
        beginMaker.next=endMaker;

        theSize=0;
        modCount++;
    }
    public int size()
    {
        return theSize;
    }

    public boolean isEmpty()
    {

        return size()==0;
    }
    public boolean add(AnyType x)
    {//顺序插入尾部插入
        add(size(),x);
        return true;
    }
    public void add(int idx,AnyType x)
    {
        //中间插入找到插入结点的位置,双向链表,将数据插入
        addBefore(getNode(idx,0,size()),x);
    }

    public AnyType get(int idx)
    {
        return getNode(idx).data;
    }
    public AnyType set(int idx,AnyType newval)
    {
        Node <AnyType> p=getNode(idx);
        AnyType oldval=p.data;
        p.data=newval;
        return oldval;
    }
    public AnyType remove(int idx)
    {
        return remove(getNode(idx));
    }
    private AnyType remove(Node<AnyType> p)
    {
        p.next.prev=p.prev;
        p.prev.next=p.next;
        theSize--;
        modCount++;
        return p.data;
    }
    private void addBefore ( Node<AnyType> p,AnyType x)
    {
        //P的前面插入
        Node<AnyType>newNode=new Node<>(x,p.prev,p);

        p.prev.next=newNode;
        p.prev=newNode;
        theSize++;
        modCount++;
    }
    private Node<AnyType> getNode(int idx)
    {
        return getNode(idx,0,size()-1);
    }
    private Node<AnyType> getNode(int idx,int lower,int upper)
    {
        Node<AnyType>p;
        if(idx<lower || idx> upper)
            throw new IndexOutOfBoundsException();
        if(idx<size()/2)
        {
            p=beginMaker.next;
            for(int i=0;i<idx;i++)
                p=p.next;
        }
        else
        {
            p=endMaker;
            for(int i=size();i>idx;i--)
                p=p.prev;
        }
        return p;
    }
    //采用Iterator接口
    public java.util.Iterator<AnyType> iterator()
    {
        return new LinkedListIterator();
    }
    public class LinkedListIterator implements java.util.Iterator<AnyType>
    {
        private Node<AnyType> current =beginMaker.next;
        private int expectedModCount=modCount;//记录迭代器在迭代的期间被修改的次数
        private boolean okToremove=false;//判断是否已经执行移除操作

        @Override
        public boolean hasNext() {
            // TODO Auto-generated method stub
            return current!=endMaker ;
        }

        @Override
        public AnyType next() {
            // TODO Auto-generated method stub
            if(modCount!=expectedModCount)
                throw new java.util.ConcurrentModificationException();
            if(!hasNext())
                throw new java.util.NoSuchElementException();
            AnyType nextItem=current.data;
            current=current.next;
            okToremove=true;
            return nextItem;
        }
        public void remove()
        {
            // TODO Auto-generated method stub
                        if(modCount!=expectedModCount)
                            throw new java.util.ConcurrentModificationException();
                        if(!okToremove)
                            throw new java.util.NoSuchElementException();
            MyLinkList.this.remove(current.prev);
            expectedModCount++;
            okToremove=false;
        }

    }

}

使用小程序对上面编写东西进行测试:

package MyArrayList;
import 自己包下的MyLinkList
import java.util.Iterator;

//使用泛型类,实现Iterator的接口,必须实现Iterator中iterator方法
public class MyArrayList <AnyType> implements Iterable<AnyType>{
    private static final int DEFAULT_CAPACITY=10;//ArryList中默认的容量10

    private int theSize;
    private AnyType [] theItems;//Number of elements
    public MyArrayList()
    {//构造函数初始化
        doClear();
    }

    private void doClear()
    {
        theSize=0;
        //开辟一个默认为10的数组
        enSureCapacity(DEFAULT_CAPACITY);
    }

    /*****为了外部调用内部方法****/
    public int size()
    {
        return theSize;
    }
    public boolean isEmpty()
    {
        return size()==0;
    }
    public void trimToSize()
    {
        enSureCapacity(size());
    }
    @SuppressWarnings("unchecked")
    public void enSureCapacity(int newCapacity)
    {
        if(newCapacity<theSize)
            return;
        //如果发现要的容量大于theSize,必须开辟更多空间
        AnyType [] old=theItems;
        theItems=(AnyType[]) new Object[newCapacity];
        for(int i=0;i<theSize;i++)
            theItems[i]=old[i];

    }
    public AnyType get(int idx)
    {
        if(idx<0||idx>=size())
            throw new ArrayIndexOutOfBoundsException();
        return theItems[idx];
    }
    public AnyType set(int idx,AnyType newVal)
    {
        if(idx<0||idx>=size())
            throw new ArrayIndexOutOfBoundsException();
        AnyType old=theItems[idx];
        theItems[idx]=newVal;
        return old;//告诉我们已经完成设置
    }
    public void add(int idx,AnyType x)
    {//防止是否在数组满情况下相加
        if(size()==theItems.length)
        {
            enSureCapacity(size()*2+1);
        }
        //在idx位置上插入一个数,将idx右侧数据向右边移动,腾出插入位置
        for(int i=theSize;i>idx;i--)
            theItems[i]=theItems[i-1];
        theItems[idx]=x;
        theSize++;

    }
    public AnyType remove(int idx)
    {
        //与插入相反,将右侧位置覆盖就行
        AnyType removeItem=theItems[idx];
        for(int i=idx;i<size();i++)
            theItems[i]=theItems[i++];
        theSize--;
        return removeItem;
    }
    //对ArrayList数组数进行遍历:
    public void access()
    {  AnyType val=null;

        for(int i=0;i<size();i++)
        {
            val=theItems[i];
            System.out.print(val+" ");
        }
    }
    //实现Iterator下iterator方法
    @Override
    public    java.util.Iterator<AnyType>  iterator() {
        // TODO Auto-generated method stub
        return new ArrayListIterator();
        //这个实列实现Iterator接口
    }
    private class ArrayListIterator implements java.util.Iterator<AnyType>
    {
        private int current=0;
        @Override
        public boolean hasNext() {
            // TODO Auto-generated method stub

            return current<size();
        }

        @Override
        public AnyType next() {
            // TODO Auto-generated method stub
            if(!hasNext())
                throw new java.util.NoSuchElementException();
            return theItems[current++];
        }
        public void remove()
        {
            MyArrayList.this.remove(--current);
        }

    }
    public static  void main(String[] args)
    {
        MyArrayList<Integer> test=new MyArrayList<Integer>();
        test.enSureCapacity(10);
        test.add(0, 1);
        test.access();

    }

}
*****测试自己编写的LinkList*********
current val3
push stack top is c
After pop 2
pop stack top b
*****测试jdk的LinkList*********
2
1
*****测试自己编写的LinkList*********
显示队列中顶元素a
删除队列中元素a
显示队列中顶元素b
*****测试jdk的LinkList*********
queue.element():20
queue.remove():20
时间: 2024-10-26 12:06:56

LinkList的相关文章

链表中LinkList L与LinkList *L 借鉴

链表中LinkList L与LinkList *L的区别以及(*L).elem,L.elem L->next,(*L)->next的区别typedef struct Node{int elem;struct node * next;}node,*LinkList; 对于LinkList L: L是指向定义的node结构体的指针,可以用->运算符来访问结构体成员,即L->elem,而(*L)就是个Node型的结构体了,可以用点运算符访问该结构体成员,即(*L).elem; 对于Lin

Data_Struct(LinkList)

最近在学数据结构,学到链表这节作业有链表,毕竟菜鸟代码基本照看书上算法写的,再加上自己的小修改,这里先记录下来,万一哪天想看了,来看看. 里面有用到二级指针,还是不太理解,还有就是注释不多,后续有了更好的理解,再来添加 1 #define TRUE 1 2 #define FALSE 0 3 #define OK 1 4 #define ERROR 0 5 #define OVERFLOW -2 6 #define INFEASIBLE -1 7 #define Status int 8 #de

转——链表中LinkList L与LinkList *L的区别

typedef struct Node{ int elem; struct node * next; }node,*LinkList; 对于LinkList L: L是指向定义的node结构体的指针,可以用->运算符来访问结构体成员,即L->elem,而(*L)就是个Node型的结构体了,可以用点运算符访问该结构体成员,即(*L).elem; 对于LinkList *L:L是指向定义的Node结构体指针的指针,所以(*L)是指向Node结构体的指针,可以用->运算符来访问结构体成员,即(

002 -- Circle LinkList 2 -- connect 2 circle link lists

The operation fullfilled codes: // A, B is the rear for 2 LinkList with nodes LinkList Connect(LinkList A,LinkList B) { p = A->next; // use p to store A list head A->next = B->next->next; // A change to point to b1 as the next. free(B->next

1.使用C++封装一个链表类LinkList

 使用C++封装一个链表类LinkList.写出相应一个测试用例 链表需要提供 添加 修改删除 除重 合并 排序创建 销毁等接口. 不能调用库函数或者使用STL等类库 题目延伸***********逆置链表********** LinkNode.h #ifndef LINKNODE_H #define LINKNODE_H #include <iostream> class LinkNode { public: int m_idata; LinkNode* m_pnext; }; #end

Java集合篇二:LinkList

package com.test.collection; /** * 自定义实现LinkList * * 1.双向链表 * 实现原理:底层封装Node节点对象(每个节点存放有3部分内容:1.上个节点的位置,2.当前节点内容,3.下一个节点的位置) * * 2.查询 * LinkList 相较 ArrayList 查询效率低: * 由于LinkList底层存放元素的不是数组,不能直接通过索引进行获取,需要从头或者从尾逐一遍历索引节点对象. * ArrayList直接通过索引获取即可. * * 3.

java学习第15天(Linklist Vector)

根据集合的分类(上一天有说),首先接触的是ArrayList但是和Collection一样,他没有什么特殊的功能,直接跳过,然后是Vector. 一   Vector A:有特有功能 a:添加 public void addElement(E obj) -- add() b:获取 public E elementAt(int index) -- get() 主要用的是第二个获取.举个例子. 简化书写下: v.addElement("hello"); v.addElement("

002 -- Circle LinkList 3 -- Puzzels_Magic Poker and Latin

000--Magic Poker Put the poker with specific sequence, so that they can show as below: count 1, open the first card as A, count 2, the first one place to bottom and open the second one as 2; for 3, the first 2 cards put to the bottom, and open the th

string和stringbuffer的区别 集合的作用 ArrayList vector linklist hashmap hashtable collection和collections

string给定的长度 不可变,当多个字符串联合的时候先转化为stringbuffer然后联合,速度慢,stringbuffer可以改变字符串的长度,当多个字符串连接的时候采用stringbuffer效率比较高. 集合的作用 对数据进行传送,对数据进行增删改查,还可以用来存放不同的对象. import java.util.Vector;import java.util.List;import java.util.Iterator;import java.util.Enumeration; /**