单链表的实现

单链表的实现

1.接口

package Test.DS.LinkedList;

/**
 * @Name:链表接口
 * @Author:ZYJ
 * @Date:2019-07-23-15:21
 * @Description:
 */
public interface ILinked {
    // 头插法
    void addFirst(int data);

    // 尾插法
    void addLast(int data);

    // 任意位置插入,第一个数据节点为0号下标
    void addIndex(int index, int data);

    // 查找是否包含关键字key是否在单链表当中
    boolean contains(Object data);

    // 删除第一次出现关键字为key的节点

    Object remove(int index);

    //删除所有值为key的节点
    void removeAllKey(Object key);

    //获取指定索引的节点
    Object get(int index);

    //将指定索引的数据设置为data
    Object set(int index, Object newData);

    //得到单链表的长度
    int getLength();

    void display();

}

2.实现类

package Test.DS.LinkedList;

/**
 * @Name:实现单链表
 * @Author:ZYJ
 * @Date:2019-07-24-08:56
 * @Description:
 */
public class LinkedListImpl implements ILinked {
    private Node dummyHead;
    private int size;
    private class Node{
        private Object date;
        private Node next;

        public Node(Object date) {
            this.date = date;
        }

        public Node(Object date, Node next) {
            this.date = date;
            this.next = next;
        }
    }

    public LinkedListImpl() {
        dummyHead=new Node(null,null);
    }

    /**
     * 头插
     * @param data
     */
    @Override
    public void addFirst(int data) {
       addIndex(0,data);
    }

    /**
     * 尾插
     * @param data
     */
    @Override
    public void addLast(int data) {
       addIndex(size,data);
    }

    /**
     * 指定位置插入
     * @param index
     * @param data
     */
    @Override
    public void addIndex(int index, int data) {
        rangCheck(index);
        Node prev = dummyHead;
        for(int i=0;i<index;i++){
            prev=prev.next;
        }
        Node newNode = new Node(data,prev.next);
        prev.next=newNode;
        size++;
    }

    /**
     * 判断是否存在指定值
     * @param data
     * @return
     */
    @Override
    public boolean contains(Object data) {
        if(data==null){
            for(Node prev =dummyHead.next;prev!=null;prev=prev.next){
                if(prev.date==null){
                    return true;
                }
            }
        }else {
            for(Node prev =dummyHead.next;prev!=null;prev=prev.next){
                if (prev.date.equals(data)){
                    return true;
                }
            }
        }
        return false;
    }

    @Override
    public Object remove(int index) {
        rangCheck(index);
        Node prev= dummyHead;
        Object oldData=node(index).date;
        for(int i=0;i<index;i++){
            prev=prev.next;
        }
        prev.next=prev.next.next;
        size--;
        return oldData;
    }

    /**
     * 删除所有值为指定值的节点
     * @param key
     */
    @Override
    public void removeAllKey(Object key) {
        Node prev =dummyHead;
        while (prev.next!=null){
            if (prev.next.date==key){
                prev.next=prev.next.next;
                size--;
            }else {
                prev=prev.next;
            }
        }
    }

    /**
     * 获取指定索引的节点
     * @param index
     * @return
     */
    @Override
    public Object get(int index) {
        return node(index).date;
    }

    /**
     * 将指定索引的值设置为
     * @param index
     * @param newData
     * @return
     */
    @Override
    public Object set(int index, Object newData) {
        rangCheck(index);
        Object oldData =node(index).date;
        node(index).date=newData;
        return oldData;
    }

    @Override
    public int getLength() {
        return size;
    }

    @Override
    public void display() {
     /* for(Node prev =dummyHead.next;prev!=null;prev=prev.next){
          System.out.print(prev.date);
      }
        System.out.println();*/
     for(int i=0;i<size;i++){
         System.out.print(node(i).date);
     }
        System.out.println();

    }

    /**
     * 取得当前节点
     * @param index
     * @return
     */
    private Node node(int index){
        rangCheck(index);
        Node prev = dummyHead.next;
        for(int i=0;i<index;i++){
            prev=prev.next;
        }
        return prev;
    }

    /**
     * 检查下标
     * @param index
     */
    private void rangCheck(int index) {
        if(index<0||index>size){
            throw new IndexOutOfBoundsException("下标不合法");
        }
    }
}

3. 测试类

package Test.DS.LinkedList;

/**
 * @Name:测试类
 * @Author:ZYJ
 * @Date:2019-07-24-09:06
 * @Description:
 */
public class TestDemo {
    public static void main(String[] args) {
        ILinked iLinked = new LinkedListImpl();
        /*iLinked.addIndex(0,1);
        iLinked.addIndex(1,2);
        iLinked.addIndex(2,3);
        iLinked.addIndex(3,4);
        iLinked.addIndex(4,5);
        iLinked.addIndex(5,6);
        iLinked.addFirst(0);
        iLinked.addFirst(7);
        System.out.println(iLinked.contains(11));
        System.out.println(iLinked.get(3));//2
        System.out.println(iLinked.set(3,777));
        System.out.println(iLinked.get(3));
        System.out.println(iLinked.remove(3));//777
        System.out.println(iLinked.get(3));*/
        iLinked.addLast(1);
        iLinked.addLast(1);
        iLinked.addLast(4);
        iLinked.addLast(1);
        iLinked.addLast(8);
        iLinked.addLast(1);
        iLinked.addLast(1);
        iLinked.display();//1141811
        iLinked.removeAllKey(1);
        iLinked.display();//48
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值