一、基础接口设计
接口是考虑到扩展性以及规范化而准备的,我们设计的链表主要有以下这些接口,完成基本功能即可。
public interface list {
int size();
void addFirst(Object data);
void addLast(Object data);
void add(Object data, int index) throws Exception;
void removeFirst() throws Exception;
void removeLast() throws Exception;
void remove(int index) throws Exception;
void remove(Object data) throws Exception;
Object getFirst();
Object getLast();
Object get(int index) throws Exception;
boolean contains(Object data);
void clear();
}
二、单向简单链表
2.1 功能简介
- 链表的基本功能满足
2.2 代码
/**
* 单向简单指针链表
* <p>
* head --> node1 --> node2 --> node3 <-- last
*/
public class MySingleList implements list {
private class ListNode {
private Object data;
public ListNode next;
public ListNode(Object data) {
this.data = data;
}
}
private ListNode head;
private ListNode last;
private int size;
public MySingleList() {
}
@Override
public int size() {
return this.size;
}
/**
* 头节点插入
* <p>
* head --> newNode --> node1 --> node2 --> node3 <-- last
*/
@Override
public void addFirst(Object data) {
ListNode f = head;
ListNode newNode = new ListNode(data);
// head指向newNode
head = newNode;
if (f == null) {
// f为空,这个节点就是第一个节点,head与last都指向newNode
last = newNode;
} else {
// f不为空,按照标准头节点插入处理
newNode.next = f;
}
this.size++;
}
/**
* 尾节点插入
* <p>
* head --> node1 --> node2 --> node3 --> newNode <-- last
*/
@Override
public void addLast(Object data) {
ListNode l = last;
ListNode newNode = new ListNode(data);
// last指向newNode
last = newNode;
if (l == null) {
// l为空,这个节点就是第一个节点,head与last都指向newNode
head = newNode;
} else {
// l不为空,按照标准尾节点插入处理
l.next = newNode;
}
this.size++;
}
/**
* 中间节点插入
* <p>
* head --> node1 --> node2 --> newNode --> node3 <-- last
*/
private void addMiddle(Object data, int index) {
ListNode pre = find(index - 1);
ListNode newNode = new ListNode(data);
newNode.next = pre.next;
pre.next = newNode;
this.size++;
}
/**
* 在指定位置插入节点
*/
@Override
public void add(Object data, int index) throws Exception {
if (index > this.size - 1 || index < 0) {
throw new Excepti