LinkedList重写(4)LinkedList实现add()方法

package Study.Collection;


/**
 * <p>Description: </p>
 * 插入结点,add()方法实现
 * @author zhangyan
 * @date 2018/12/23 9:44
 */
public class YanLinkedList03 {


    private   Node  first;
    private   Node  last;

    private  int size;


    public  void  add(int index, Object  obj) {

        //定义新节点newNode
        Node  newNode = new Node(obj);
        //找到索引对应的节点temp
        Node  temp  =  getNode(index);

        if(temp!=null){
            Node up = temp.previous;

            if(index==size){               //最后一个元素
                last.next = newNode;
                newNode.previous = last;
            }
            if(index==0){                  //第一个元素
                newNode.next = first;
                first.previous = newNode;
            }else {                        //正常情况下

                up.next = newNode;
                newNode.previous = up;

                newNode.next = temp;
                temp.previous = newNode;
            }

        }



    }


    public   void  remove(int index){
        Node  temp  =  getNode(index);

        if(temp!=null){
            Node  up = temp.previous;
            Node down = temp.next;

            if(up!=null){
                up.next = down;
            }

            if(down!=null){
                down.previous = up;
            }

            //被删除的元素是第一个元素时
            if(index==0){
                first = down;
            }

            //被删除的元素是最后一个元素时
            if(index == size-1){
                last = up;
            }

            size--;
        }

    }

  
    public  Object  get(int index) {

        if(index<0||index>size-1){
            throw  new RuntimeException("索引数字不合法:"+index);
        }

        Node temp = getNode(index);

        return temp!=null?temp.element:null;
    }


    public  Node  getNode(int index){
        Node  temp = null;

        if(index<=(size>>1)){   //size>>1相当于除以2
            temp = first;
            for(int i=0;i<index;i++){
                temp = temp.next;
            }
        }else{
            temp = last;
            for(int i=size-1; i>index;i--){
                temp = temp.previous;
            }
        }

        return temp;
    }




    public  void  add(Object  obj) {
        Node  node  = new Node(obj);

        if(first==null){
//			node.previous = null;
//			node.next = null;
            first = node;
            last = node;
        }else{

            node.previous = last;
            node.next = null;

            last.next = node;
            last = node;

        }

        size++;


    }

    @Override
    public String toString() {
        //[a,b,c]     first=a,    last=c
        //a,b,c
        StringBuilder   sb = new StringBuilder("[");
        Node  temp = first;
        while(temp!=null){
            sb.append(temp.element+",");
            temp = temp.next;
        }
        sb.setCharAt(sb.length()-1, ']');

        return sb.toString();
    }

    //测试
    public static void main(String[] args) {
        YanLinkedList03  list = new YanLinkedList03();

        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        list.add("e");
        list.add("f");

        System.out.println(list);
        list.add(0,"baba");
        System.out.println(list);

    }
}

解析:add()方法和remove()方法差不多,都是先找到索引对应的节点,然后更改前继和后驱节点。
当然索引index的位置要做判断,分为最后一个 元素,第一个元素和中间。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,你的问题是关于建立一个继承体系的。具体来说,你需要建立一个基类 List,然后派生出两个类 ArrayListLinkedList实现相应的函数。List 提供了 5 个函数,其中前 4 个是纯虚函数,第 5 个是虚函数。在 ArrayList 中无需再实现显示函数。是这样吗? 如果是的话,那么我可以给你提供一份参考代码,帮助你更好地理解如何实现这个继承体系,如下所示: ```c++ // 基类 List class List { public: virtual void add() = 0; // 纯虚函数,添加元素 virtual void remove() = 0; // 纯虚函数,删除元素 virtual void find() = 0; // 纯虚函数,查找元素 virtual void update() = 0; // 纯虚函数,更新元素 virtual void show() {} // 虚函数,显示元素 }; // 派生类 ArrayList class ArrayList : public List { public: void add() override { // 实现添加元素的代码 } void remove() override { // 实现删除元素的代码 } void find() override { // 实现查找元素的代码 } void update() override { // 实现更新元素的代码 } }; // 派生类 LinkedList class LinkedList : public List { public: void add() override { // 实现添加元素的代码 } void remove() override { // 实现删除元素的代码 } void find() override { // 实现查找元素的代码 } void update() override { // 实现更新元素的代码 } void show() override { // 实现显示元素的代码 } }; ``` 在上面的代码中,基类 List 定义了 5 个函数,其中前 4 个是纯虚函数,即没有实现的函数,需要在派生类中实现。第 5 个函数是虚函数,可以在派生类中选择是否重写它。派生类 ArrayListLinkedList 分别实现了这 5 个函数,其中 ArrayList 没有重写显示函数,而 LinkedList 重写了显示函数。 当你创建一个 List 对象时,它是抽象的,不能直接使用。但是你可以创建 ArrayListLinkedList 对象,它们都是 List 的子类,可以使用基类中定义的函数。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值