链表我们可以看成一列火车,有车头,有结点,首先,我们先定义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