线性表之链表实现

链表我们可以看成一列火车,有车头,有结点,首先,我们先定义Sequence接口,它里面包含一些基本的增删查改等方法,然后我们定义SequenceLinkImpl类用来实现Sequnece接口

下面先写出Sequence接口的一些方法:

public interface Sequence {
    
    /**
     * 向线性表中添加元素
     * @param date   要存储的元素
     */
    void add(Object data);
    
    /**
     * 线性表中删除元素
     * @param index   要删除的元素下标
     * @return  是否删除成功
     */
    boolean remove(int index);
    
    /**
     * 在线性表中查找指定下标的元素
     * @param index   要查找的索引
     * @return
     */
    Object get(int index);
    
    /**
     * 判断线性表中是否有指定元素
     * @param data   要查找的元素内容
     * @return
     */
    boolean contains(Object data);
    
    /**
     * 修改线性表中指定索引的内容
     * @param index   要修改元素下标
     * @param newData  修改后的内容
     * @return
     */
    Object set(int index,Object newData);
    
    /**
     * 返回当前线性表的长度
     * @return
     */
    int size();
    
    /**
     * 清空线性表内容
     */
    void clear();
    
    /**
     * 将线性表转为数组
     * @return
     */
    Object[] toArray();
}

下面是接口方法具体实现,在SequenceLinkImpl类中先定义内部类Node,

内部类Node:

class Node{
        Node next;
        Object data;
        public Node(Node next, Object data) {
            super();
            this.next = next;
            this.data = data;
        }
        public Node(Object data) {
            super();
            this.data = data;
        }
        
    }

SequenceLinkImpl类的成员属性和构造器

private Node head;
    private int size;
    
    public SequenceLinkImpl() {
        this.head = new Node(null,null);
    }

SequenceLinkImpl类的成员方法:

成员方法addLast方法和addFirst方法实现:

private void addFirst(Object data) {
        add(0,data);
    }
    private void addLast(Object data) {
        add(size,data);
    }

 

成员方法add(int,Object)方法实现:

//在任意位置添加
    public void add(int index,Object data) {
        rangeCheck(index);
        Node prev = head;
        for(int i = 0;i<index;i++) {
            prev = prev.next;
        }
        Node newNode = new Node(data);
        newNode.next = prev.next;
        prev.next = newNode;
        size++;
    }

成员方法rangeCheck实现

//判断index是否合法
    private void rangeCheck(int index) {
        if(index<0||index>size) {
            throw new IndexOutOfBoundsException("Illegal Index!");
        }
    }

成员方法node实现

//找到index的当前结点
    private Node node(int index) {
        Node prev = head.next;
        for(int i = 0;i<index;i++) {
            prev = prev.next;
        }
        return prev;
    }

add方法实现:

public void add(Object data) {
        addLast(data);
    }

remove方法实现:

public boolean remove(int index) {
        rangeCheck(index);
        Node prev = head;
        for(int i = 0;i<index;i++) {
            prev = prev.next;
        }
        //获取当前index的结点
        Node now = node(index);
        prev.next = now.next;
        now.next = now = null;
        size--;
        return true;
    }

contains方法实现:

public boolean contains(Object data) {
        Object[] arr = toArray();
        if(data == null) {
            for(int i = 0;i<arr.length;i++) {
                if(arr[i] == null) {
                    return true;
                }
            }
        }else {
            for(int i = 0;i<arr.length;i++) {
                if(data.equals(arr[i])) {
                    return true;
                }
            }
        }
        return false;
    }

get方法实现:

public Object get(int index) {
        rangeCheck(index);
        return node(index).data;
    }

set方法实现:

public Object set(int index, Object newData) {
        rangeCheck(index);
        Node node = node(index);
        Object oldData = node.data;
        node.data = newData;
        return oldData;
    }

size方法实现:

public int size() {
        return size;
    }

clear方法实现:

public void clear() {
        for(Node node = head.next;node!=null;) {
            node.data = null;
            Node tmp = node.next;
            node.next = null;
            node = tmp;
            size--;
        }
        
    }

toArray方法实现:

public Object[] toArray() {
        Object[] arr = new Object[size];
        int index = 0;
        for(Node node = head.next;node!=null;node = node.next) {
            arr[index++] = node.data;
        }
        return arr;
    }

链表就是上面代码实现:下面附上详细代码地址:

https://github.com/dukaichao/DataStructure/tree/master/dkc_ds_0312

猜你喜欢

转载自www.cnblogs.com/duy666/p/10520252.html
今日推荐