A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

//手写实现存储结构(数组和链表:数组的自动扩充,链表的节点等)
package com.helong.mylist;
//==============================================
//ArrayList
//实现它的容量自动扩充
//增删改查长度
class MyArrayList
{
        private Object[] value=null;
        private int size=0;
        MyArrayList()
        {
                value=new Object[10];
        }
        //增加
        public boolean add(Object obj)
        {
                if(size==value.length)
                        expansion();
                value[size++]=obj;
                return true;
        }
        //删除
        public boolean remove(int index)
        {
                if(index<0||index>=size)
                        return false;
                Object[] temp=new Object[size-1];//使用到数组长度的地方要由size来替代,因为size才是真实的元素个数
                for(int i=0,j=0;i<size;i++)
                {
                        if(i!=index)
                        {
                                temp[j++]=value;
                        }
                }
                value=temp;
                size--;
                return true;
        }
        //内部调用remove(int index)
        public boolean remove(Object obj)
        {
                for(int i=0;i<size;i++)
                {
                        if(value.equals(obj))
                        {
                                remove(i);
                                return true;
                        }
                }
                return false;
        }
        //修改
        public boolean set(int index,Object obj)
        {
                if(index<0||index>=size)
                        return false;
                value[index]=obj;
                return true;
        }
        //获取
        public Object get(int index)
        {
                if(index<0||index>=size)
                        return null;
                return value[index];
        }
        //长度
        public int length()
        {
                return size;
        }
       
        //复写toString方法,使得该类被打印时按照自定义方式输出
        public String toString()
        {
                String str="【";
                for(int i=0;i<size;i++)
                {
                        if(i!=size-1)
                                str+=(value+",");
                        else
                                str+=value;
                }
                str+="】";
                return str;
        }
        private boolean expansion()
        {
                Object[] temp=new Object[value.length+5];
                temp=value.clone();
                //注意:clone只对一维数组起作用,而不能用于二维数组,
                //因为java没有二维数组的概念,而只有数组的数组,二维
                //数组存储的是几个一维数组的引用,而使用clone也只是
                //拷贝了这几个引用,说白了还是原来那几个一维数组对象。
                //如果想用于二维数组,那么就遍历其中的一维数组,挨个
                //拷贝一维数组到目标二维数组中的一维数组下。
                value=temp;
                return true;
        }
}

//==============================================
//LinkedList
//节点问题
//MyLinkedList内部有一个节点成员
//增删改查长度
class MyLinkedList
{
        private MyNode head=null;
        private MyNode tail=null;
        //增加
        public void add(Object obj)
        {
                if(head==null)
                {
                        head=tail=new MyNode(null,obj);
                }
                else
                {
                        MyNode temp=new MyNode(null,obj);
                        tail.setNext(temp);
                        tail=temp;
                }
        }
        public void addFirst(Object obj)
        {
                MyNode temp=new MyNode(head,obj);
                head=temp;
        }
        public void addLast(Object obj)
        {
                add(obj);
        }
        //删除并返回删除的元素
        public Object removeFirst()
        {
                if(head==null)return null;
                Object temp=head.getObj();
                head=head.getNext();
                return temp;
        }
        public Object removeLast()
        {
                if(tail==null)return null;
                Object temp=tail.getObj();
                MyNode node =head;
                while(node.getNext()!=tail)//查询到倒数第二个节点的位置
                {
                        node=node.getNext();
                }
                tail=node;
                tail.setNext(null);//将该节点设为尾节点
                return temp;
        }
        //清空链表
        public void clear()
        {
                while(head!=null)
                {
                        MyNode temp=head;
                        head=head.getNext();
                        temp.setNext(null);
                }
                tail=head;
        }
        //获取元素但不删除
        public Object getFirst()
        {
                return head==null?null:head.getObj();
        }
        public Object getLast()
        {
                return tail==null?null:tail.getObj();
        }
        //修改元素
        public Object setFirst(Object obj)
        {
                if(head!=null)
                head.setObj(obj);
                return head==null?null:obj;
        }
        public Object setLast(Object obj)
        {
                if(tail!=null)
                tail.setObj(obj);
                return tail==null?null:obj;
        }
        //复写了Object的toString方法,按照自定义方式打印输出
        public String toString()
        {
                String str="【";
                MyNode temp=head;
                while(temp!=null)
                {
                        if(temp!=tail)
                                str+=(temp.getObj()+",");
                        else
                                str+=temp.getObj();
                        temp=temp.getNext();
                }
                str+="】";
                return str;
        }
}
class MyNode
{
        private MyNode next=null;
        private Object obj=null;
        MyNode(MyNode next,Object obj)
        {
                this.next=next;
                this.obj=obj;
        }
        public Object getObj()
        {
                return obj;
        }
        public MyNode getNext()
        {
                return next;
        }
        public void setObj(Object obj)
        {
                this.obj=obj;
        }
        public void setNext(MyNode next)
        {
                this.next=next;
        }
}


//==============================================
class  MyList
{
        public static void main(String[] args)
        {
                //MyArrayList测试
                //增加
                printLine();
                sop("MyArrayList方法测试:");
                MyArrayList mal=new MyArrayList();
                mal.add(123);
                mal.add("234");
                mal.add(23.23);
                mal.add("345");
                sop(mal.length());
                sop(mal);
                //删除时,如果传入int,那默认是调用remove(int index)而不是remove(Object obj)
                mal.remove(23.23);
                sop(mal.length());
                sop(mal);
                mal.remove("345");
                sop(mal.length());
                sop(mal);
                //按照索引位置修改元素
                mal.set(0,"修改这里");
                sop(mal);
                //获取元素
                sop("索引为0的元素:"+mal.get(0));
                sop("索引为1的元素:"+mal.get(1));
                printLine();

                //============================================
                //MyLinkedList测试
                //增加
                sop("MyLinkedList方法测试:");
                MyLinkedList mll=new MyLinkedList();
                mll.add("123");
                mll.add(23.45);
                mll.add(true);
                sop(mll);
                mll.addFirst("start");
                mll.addLast("end");
                sop(mll);
                //删除头结点,尾节点
                sop("删除元素:"+mll.removeFirst());
                sop(mll);
                sop("删除元素:"+mll.removeLast());
                sop(mll);
                //获取元素
                sop("头元素:"+mll.getFirst());
                sop("尾元素:"+mll.getLast());
                //清空链表
                sop("清空链表");
                mll.clear();
                sop(mll);
                //当链表为空时,再取其头尾结点,此处定义成不会报异常会返回null
                sop("头元素:"+mll.getFirst());
                sop("尾元素:"+mll.getLast());
                //修改头尾结点值,注意此时链表并无数据,因此返回null
                sop("修改后头元素:"+mll.setFirst("head"));
                sop("修改后尾元素:"+mll.setLast("tail"));
                mll.add("ldy001");mll.add("ldy002");mll.add("ldy003");mll.add("ldy004");mll.add("ldy005");
                sop(mll);
                sop("修改后头元素:"+mll.setFirst("head"));
                sop("修改后尾元素:"+mll.setLast("tail"));
                sop(mll);
        }
        private static void sop(Object obj)
        {
                System.out.println(obj);
        }
        private static void printLine()
        {
                sop("============================================");
        }
}
运行图:



评分

参与人数 1技术分 +2 收起 理由
lwj123 + 2

查看全部评分

15 个回复

倒序浏览
额,那几个小表情相信大家也能看懂的哈,不会发代码呢。。。。。。。直接发文本竟然变成了return head==null?nullbj;
回复 使用道具 举报
??????
回复 使用道具 举报
还不错,,,算是雏形版本
回复 使用道具 举报
技术分快到碗里来
回复 使用道具 举报
我再重发一次吧,这个代码格式太难看了
回复 使用道具 举报
Nemo 中级黑马 2015-6-16 14:57:49
7#
  1. //手写实现MyArrayList和MyLinkedList
  2. package com.helong.mylist;
  3. //==============================================
  4. //ArrayList
  5. //实现它的容量自动扩充
  6. //增删改查长度
  7. class MyArrayList
  8. {
  9.         private Object[] value=null;
  10.         private int size=0;
  11.         MyArrayList()
  12.         {
  13.                 value=new Object[10];
  14.         }
  15.         //增加
  16.         public boolean add(Object obj)
  17.         {
  18.                 if(size==value.length)
  19.                         expansion();
  20.                 value[size++]=obj;
  21.                 return true;
  22.         }
  23.         //删除
  24.         public boolean remove(int index)
  25.         {
  26.                 if(index<0||index>=size)
  27.                         return false;
  28.                 Object[] temp=new Object[size-1];//使用到数组长度的地方要由size来替代,因为size才是真实的元素个数
  29.                 for(int i=0,j=0;i<size;i++)
  30.                 {
  31.                         if(i!=index)
  32.                         {
  33.                                 temp[j++]=value[i];
  34.                         }
  35.                 }
  36.                 value=temp;
  37.                 size--;
  38.                 return true;
  39.         }
  40.         //内部调用remove(int index)
  41.         public boolean remove(Object obj)
  42.         {
  43.                 for(int i=0;i<size;i++)
  44.                 {
  45.                         if(value[i].equals(obj))
  46.                         {
  47.                                 remove(i);
  48.                                 return true;
  49.                         }
  50.                 }
  51.                 return false;
  52.         }
  53.         //修改
  54.         public boolean set(int index,Object obj)
  55.         {
  56.                 if(index<0||index>=size)
  57.                         return false;
  58.                 value[index]=obj;
  59.                 return true;
  60.         }
  61.         //获取
  62.         public Object get(int index)
  63.         {
  64.                 if(index<0||index>=size)
  65.                         return null;
  66.                 return value[index];
  67.         }
  68.         //长度
  69.         public int length()
  70.         {
  71.                 return size;
  72.         }
  73.        
  74.         //复写toString方法,使得该类被打印时按照自定义方式输出
  75.         public String toString()
  76.         {
  77.                 String str="【";
  78.                 for(int i=0;i<size;i++)
  79.                 {
  80.                         if(i!=size-1)
  81.                                 str+=(value[i]+",");
  82.                         else
  83.                                 str+=value[i];
  84.                 }
  85.                 str+="】";
  86.                 return str;
  87.         }
  88.         private boolean expansion()
  89.         {
  90.                 Object[] temp=new Object[value.length+5];
  91.                 temp=value.clone();
  92.                 //注意:clone只对一维数组起作用,而不能用于二维数组,
  93.                 //因为java没有二维数组的概念,而只有数组的数组,二维
  94.                 //数组存储的是几个一维数组的引用,而使用clone也只是
  95.                 //拷贝了这几个引用,说白了还是原来那几个一维数组对象。
  96.                 //如果想用于二维数组,那么就遍历其中的一维数组,挨个
  97.                 //拷贝一维数组到目标二维数组中的一维数组下。
  98.                 value=temp;
  99.                 return true;
  100.         }
  101. }

  102. //==============================================
  103. //LinkedList
  104. //节点问题
  105. //MyLinkedList内部有一个节点成员
  106. //增删改查长度
  107. class MyLinkedList
  108. {
  109.         private MyNode head=null;
  110.         private MyNode tail=null;
  111.         //增加
  112.         public void add(Object obj)
  113.         {
  114.                 if(head==null)
  115.                 {
  116.                         head=tail=new MyNode(null,obj);
  117.                 }
  118.                 else
  119.                 {
  120.                         MyNode temp=new MyNode(null,obj);
  121.                         tail.setNext(temp);
  122.                         tail=temp;
  123.                 }
  124.         }
  125.         public void addFirst(Object obj)
  126.         {
  127.                 MyNode temp=new MyNode(head,obj);
  128.                 head=temp;
  129.         }
  130.         public void addLast(Object obj)
  131.         {
  132.                 add(obj);
  133.         }
  134.         //删除并返回删除的元素
  135.         public Object removeFirst()
  136.         {
  137.                 if(head==null)return null;
  138.                 Object temp=head.getObj();
  139.                 head=head.getNext();
  140.                 return temp;
  141.         }
  142.         public Object removeLast()
  143.         {
  144.                 if(tail==null)return null;
  145.                 Object temp=tail.getObj();
  146.                 MyNode node =head;
  147.                 while(node.getNext()!=tail)//查询到倒数第二个节点的位置
  148.                 {
  149.                         node=node.getNext();
  150.                 }
  151.                 tail=node;
  152.                 tail.setNext(null);//将该节点设为尾节点
  153.                 return temp;
  154.         }
  155.         //清空链表
  156.         public void clear()
  157.         {
  158.                 while(head!=null)
  159.                 {
  160.                         MyNode temp=head;
  161.                         head=head.getNext();
  162.                         temp.setNext(null);
  163.                 }
  164.                 tail=head;
  165.         }
  166.         //获取元素但不删除
  167.         public Object getFirst()
  168.         {
  169.                 return head==null?null:head.getObj();
  170.         }
  171.         public Object getLast()
  172.         {
  173.                 return tail==null?null:tail.getObj();
  174.         }
  175.         //修改元素
  176.         public Object setFirst(Object obj)
  177.         {
  178.                 if(head!=null)
  179.                 head.setObj(obj);
  180.                 return head==null?null:obj;
  181.         }
  182.         public Object setLast(Object obj)
  183.         {
  184.                 if(tail!=null)
  185.                 tail.setObj(obj);
  186.                 return tail==null?null:obj;
  187.         }
  188.         //复写了Object的toString方法,按照自定义方式打印输出
  189.         public String toString()
  190.         {
  191.                 String str="【";
  192.                 MyNode temp=head;
  193.                 while(temp!=null)
  194.                 {
  195.                         if(temp!=tail)
  196.                                 str+=(temp.getObj()+",");
  197.                         else
  198.                                 str+=temp.getObj();
  199.                         temp=temp.getNext();
  200.                 }
  201.                 str+="】";
  202.                 return str;
  203.         }
  204. }
  205. class MyNode
  206. {
  207.         private MyNode next=null;
  208.         private Object obj=null;
  209.         MyNode(MyNode next,Object obj)
  210.         {
  211.                 this.next=next;
  212.                 this.obj=obj;
  213.         }
  214.         public Object getObj()
  215.         {
  216.                 return obj;
  217.         }
  218.         public MyNode getNext()
  219.         {
  220.                 return next;
  221.         }
  222.         public void setObj(Object obj)
  223.         {
  224.                 this.obj=obj;
  225.         }
  226.         public void setNext(MyNode next)
  227.         {
  228.                 this.next=next;
  229.         }
  230. }


  231. //==============================================
  232. class  MyList
  233. {
  234.         public static void main(String[] args)
  235.         {
  236.                 //MyArrayList测试
  237.                 //增加
  238.                 printLine();
  239.                 sop("MyArrayList方法测试:");
  240.                 MyArrayList mal=new MyArrayList();
  241.                 mal.add(123);
  242.                 mal.add("234");
  243.                 mal.add(23.23);
  244.                 mal.add("345");
  245.                 sop(mal.length());
  246.                 sop(mal);
  247.                 //删除时,如果传入int,那默认是调用remove(int index)而不是remove(Object obj)
  248.                 mal.remove(23.23);
  249.                 sop(mal.length());
  250.                 sop(mal);
  251.                 mal.remove("345");
  252.                 sop(mal.length());
  253.                 sop(mal);
  254.                 //按照索引位置修改元素
  255.                 mal.set(0,"修改这里");
  256.                 sop(mal);
  257.                 //获取元素
  258.                 sop("索引为0的元素:"+mal.get(0));
  259.                 sop("索引为1的元素:"+mal.get(1));
  260.                 printLine();

  261.                 //============================================
  262.                 //MyLinkedList测试
  263.                 //增加
  264.                 sop("MyLinkedList方法测试:");
  265.                 MyLinkedList mll=new MyLinkedList();
  266.                 mll.add("123");
  267.                 mll.add(23.45);
  268.                 mll.add(true);
  269.                 sop(mll);
  270.                 mll.addFirst("start");
  271.                 mll.addLast("end");
  272.                 sop(mll);
  273.                 //删除头结点,尾节点
  274.                 sop("删除元素:"+mll.removeFirst());
  275.                 sop(mll);
  276.                 sop("删除元素:"+mll.removeLast());
  277.                 sop(mll);
  278.                 //获取元素
  279.                 sop("头元素:"+mll.getFirst());
  280.                 sop("尾元素:"+mll.getLast());
  281.                 //清空链表
  282.                 sop("清空链表");
  283.                 mll.clear();
  284.                 sop(mll);
  285.                 //当链表为空时,再取其头尾结点,此处定义成不会报异常会返回null
  286.                 sop("头元素:"+mll.getFirst());
  287.                 sop("尾元素:"+mll.getLast());
  288.                 //修改头尾结点值,注意此时链表并无数据,因此返回null
  289.                 sop("修改后头元素:"+mll.setFirst("head"));
  290.                 sop("修改后尾元素:"+mll.setLast("tail"));
  291.                 mll.add("ldy001");mll.add("ldy002");mll.add("ldy003");mll.add("ldy004");mll.add("ldy005");
  292.                 sop(mll);
  293.                 sop("修改后头元素:"+mll.setFirst("head"));
  294.                 sop("修改后尾元素:"+mll.setLast("tail"));
  295.                 sop(mll);
  296.         }
  297.         private static void sop(Object obj)
  298.         {
  299.                 System.out.println(obj);
  300.         }
  301.         private static void printLine()
  302.         {
  303.                 sop("============================================");
  304.         }
  305. }
复制代码
回复 使用道具 举报
这么长,是闭上眼睛写的吗?
回复 使用道具 举报
Nemo 中级黑马 2015-6-16 18:00:08
9#
日薄星回 发表于 2015-6-16 17:33
这么长,是闭上眼睛写的吗?

为啥要闭眼呢?
回复 使用道具 举报
反正就是厉害!
回复 使用道具 举报
学习了
回复 使用道具 举报
hi潘 中级黑马 2015-6-18 21:24:55
12#
Nemo 发表于 2015-6-16 14:55
我再重发一次吧,这个代码格式太难看了

可以修改帖子的,没必要重发
回复 使用道具 举报
学习了 厉害。
回复 使用道具 举报
Nemo 中级黑马 2015-6-19 09:57:43
14#
hi潘 发表于 2015-6-18 21:24
可以修改帖子的,没必要重发

好吧,还不熟这个
回复 使用道具 举报
JRT 中级黑马 2015-6-19 19:39:53
15#
这比C语言版的还多
回复 使用道具 举报
嗯,这个不错
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马