-编写接口
package com.lzq.ListInterface;
public interface List<E> {
//获取实际储存内容的大小
int size();
//判断数组实际储存内容是否为空
boolean isEmpty();
//往数组中添加内容
void add(E e);
//取数据
E get(int index);
//删除
boolean remove(int index);
}
- 编写Node类
package com.lzq.LinkedList;
public class Node <E>{
//节点内容
E value;
//先驱节点
Node prev;
//后继节点
Node next;
}
- 编写实现类
package com.lzq.LinkedList;
import com.lzq.ListInterface.List;
public class LinkedList<E> implements List<E> {
//定义头指针
private Node first;
//定义尾指针
private Node last;
//定义链表大小
int size;
@Override
public int size() {
return size;
}
@Override
public boolean isEmpty() {
return size == 0;
}
@Override
public void add(E e) {
Node node = new Node();
node.value = e;
/*如果头指针为空新创建节点从当第一个节点,并且头指针指向第一个节点。
如果不为空,那么将node节点插到最后,并且尾指针指向最后一个节点*/
if(first == null){
first = node;
}else{
last.next = node;
node.prev = last;
}
last = node;
size ++;
}
@Override
public E get(int index) {
//校验索引是否合法
if(index >= size || index < 0){
throw new RuntimeException("索引不合法!!!");
}
//node=头指针,向后移
Node node = first;
for(int i = 0; i < index; i ++){
node = node.next;
}
return (E)node.value;
}
@Override
public boolean remove(int index) {
//校验索引是否合法
if(index >= size || index < 0){
throw new RuntimeException("索引不合法!!!");
}
//根据index找到节点的位置
Node node = first;
for(int i = 0; i < index; i ++){
node = node.next;
}
//找到节点的前驱和后继节点
Node prevNode = node.prev;
Node nextNode = node.next;
//将节点的前驱和后继节点连接起来
if(prevNode != null){
prevNode.next = nextNode;
}
if(nextNode != null) {
nextNode.prev = prevNode;
}
return true;
}
}