package com.itbaizhan.myLIST;
public class MyDoublyLinkedList<E> implements MyList<E> {
//定义双向列表节点对象
class Node<E>{
E item;
Node<E> prev;//用来记录前一个地址的节点对象
Node<E> next;//记录下一个
Node(Node<E> prev,E item,Node<E> next){
this.item = item;
this.next = next;
this.prev = prev;
}
}
private Node head;//记录头节点
private Node tail;//记录尾节点
private int size;
@Override
public void add(E element) {
this.LinkLast(element);
}
//将节点对象添加到双向链表的尾部
private void LinkLast(E element){
Node t = this.tail;
//创建节点对象
Node<E> node = new Node<>(t,element,null);
//将新节点定义为尾节点
this.tail = node;
if (t==null){
this.head = node;
}else {
t.next= node;
}
this.size++;
}
@Override
public E get(int index) {
//先进行合法性校验
this.checkIndex(index);
//根据位置查找节点对象
Node<E> node = this.getNode(index);
return node.item;
}
private void checkIndex(int index){
if (index>=0&&index<this.size){
throw new IndexOutOfBoundsException(index+" "+size);
}
}
//根据位置获取指定节点对象
private Node getNode(int index){
//判断当前位置距离头尾哪个节点近
if (index<(this.size>>1)){
Node node = this.head;
for (int i = 0;i<index;i++){
node = node.next;
}
return node;
}else{
Node node = this.tail;
for (int i = this.size-1;i>index;i--){
node = node.prev;
}
return node;
}
}
@Override
public int size() {
return this.size;
}
@Override
public E remove(int index) {
//对index进行合法性校验
this.checkIndex(index);
//根据位置获取节点对象
Node<E> node = this.getNode(index);
//获取节点对象中的元素
E item = node.item;
//判断当前节点是否为头节点
if (node.prev == null){
this.head = node.next;
}else{
//完成当前节点的直接前驱节点与当前节点的直接后继节点的挂接
node.prev.next = node.next;
}
//判断当前节点是否为尾节点
if (node.next==null){
this.tail = node.prev;
}else {
node.next.prev = node.prev;
}
node.prev = null;
node.next = null;
node.item = null;
this.size--;
return item;
}
//再双向列表的头添加元素
public void addFirst(E element){
this.linkFirst(element);
}
//在链表的头添加元素
private void linkFirst(E element){
//获取头节点对象
Node head = this.head;
Node node = new Node(null,element,head);
//将新节点定义为头节点
this.head = node;
//判断当前链表中是否有节点,如果有即是头也是尾
if (head==null){
this.tail = node;
}else{
head.prev = node;
}
//记录个数
this.size++;
}
public void addLast(E element){
this.LinkLast(element);
}
public static void main(String[] args) {
System.out.println("-------------------");
MyDoublyLinkedList<String> list = new MyDoublyLinkedList<>();
list.add("a");
list.addFirst("A");
list.addLast("b");
System.out.println(list.get(1));
for (int i = 0;i<list.size();i++){
System.out.println(list.get(i));
}
}
}
报了一个这样的错误,但我总觉得没错才对,所以想请教一下老师
-------------------
Exception in thread "main" java.lang.IndexOutOfBoundsException: 1 3
at com.itbaizhan.myLIST.MyDoublyLinkedList.checkIndex(MyDoublyLinkedList.java:57)
at com.itbaizhan.myLIST.MyDoublyLinkedList.get(MyDoublyLinkedList.java:48)
at com.itbaizhan.myLIST.MyDoublyLinkedList.main(MyDoublyLinkedList.java:151)