自定义链表(一)——小试牛刀

自定义链表(一)——小试牛刀

我们除了上次我们讲到自定义队列,当然,我们同样可以自定义链表,不过我觉得自定义链表要比自定义队列更抽象,所以,当你顿悟到自定义列表的奥义时,内心的成就感好强烈的说,恨不得一下子吧他更多的方法都实现。在我最初与自定义链表交手的时候最容易犯的错误就是空指针。所以,大家一定要注意啊,链表可不是随随便便就能打倒的小怪兽啊~要加油哦;

在编写自定义链表的时候,我们不仅需要编写整个链表的实现代码,也要编写节点,节点很简单待会儿看代码大家就知道了:

首先是节点代码

文件:

这里我我同样使用了泛型以不同的数据结构

package linePackage;

 

public class LinkNoke<E> {

 

         private E  e;//我们想存的数据就放在这里面

         private LinkNoke next;//连接下一个数据(存放下一个数据的地址)

         public LinkNoke(){

         }

         public LinkNoke(E e){

                   this.e = e;

         }

         public Object getObject(){

                   return e;

         }

         public void setObject(E e){

                   this.e = e;

         }

         public LinkNoke getNext(){

                   return next;

         }

         public void setNext(LinkNoke next){

                   this.next = next;

         }

        

}

链表:

文件:

package linePackage;

 

publicclass LinkQuaue<E> {

    private LinkNoke root;

    private LinkNoke last;

//注意:rootlast是自定义链表必须有的两个属性;否则会导致错误,有些同学把只last定义在last内,结果永远只有一个节点……

    publicvoid add(E e){

    LinkNoke<E> next = new LinkNoke(e);

//如果链表为空    

if(root==null){//注意:如果对象为空,他的方法和属性都无法被调用,否则就会报空指针异常,所以一定要注意,在使用他之前一定要保证他被系统分配了内存空间可以以LinkNoke<E> next = new LinkNoke(e);这种方式,或者以root = new LinkNoke();的方式都可以

           //root = new LinkNoke();

           root = next;

           last = root

//如果添加的元素第一个元素:收尾相同;

       }else{//如果链表不为空

           last.setNext(next);

           //last.setObject(e);

           last = next;

       }

    }

//获取某个节点

    public Object getLinkNoke(int index){

       int count=0;

       LinkNoke<E> next = new LinkNoke();

       next = root;

       while(count!=index){

           next = next.getNext();

           count++;

       }

       return next.getObject();

    }

//删除要分三种情况:删第一个,删中间,删最后一个

    publicvoid deletLinkNoke(int index){

       int count=0;

       LinkNoke<E> next = new LinkNoke();

       LinkNoke<E> before = new LinkNoke();

 

       if(index==0){//如果删的是第一个

         root = root.getNext();

        

       }

       else{//否则——

           next = root;

       while(count!=index-1){

           next = next.getNext();

           count++;

       }if(this.getLength()>index)/*如果删的不是最后一个*/{

       before=next;

      

       while(count!=index+1){

           next = next.getNext();

           count++;

       }

       before.setNext(next);

       }else{//否则直接让倒数第二个接null

           next.setNext(null);

           last = next;

       }

       }

      

    } //

 

    publicint getLength(){

       int count =0;

       LinkNoke<E> next = new LinkNoke();

       next = root;

      

       while(next.getNext()!=null){

           next = next.getNext();//一开始少了这个……死循环

           count++;

       }

      

       return count;

    }

 

}

//之后我会将这段代码的其他方法补上,大家耐心等等哈~

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值