链表的index的检查:
检查index是否越界的方法
private void OutBounds(int index){
throw new IndexOutOfBoundsException("Index:" + index + ",Size:" + size)
}
index范围检查
private void rangeCheck(int index){
if(index < 0 || index > size)
OutBounds();
}
添加方法的index检查
private void rangeCheckForAdd(int index){
if(index < 0 || index =>size)//这里可以是等于,相当于添加在最后一个位置
OutBounds();
}
无头结点
初始化部分:
private Node<E> first;
private static class Node<E>{
E element;
Node<E> next;
public Node (E element,Node<E> next){
this.element=element;
this.next=next;
}
}
方法
node(int index):返回第index位置的结点
供链表内部使用的方法
private Node<E> node(int index){
rangeCheck(index);
Node<E> node=first;
for(int i=0;i<index;i++){
node=node.next;
}
return node;
}
add(int index,E element):在指定位置添加结点
public void add(int index,E element){
rangeCheckForAdd(index);
//需要分开讨论
if(index==0){
first=new Node<E>(element,first.next);
}else{
Node<E> prev =node(index-1);//获取添加结点位置的前一个结点
node.next=prev.next;
prev.next=node;
}
size++;
}
add():增加结点
public void add(E elemnet){
add(size,element);
}
remove():删除方法,返回的是删除掉的结点
public Node<E> remove(int index){
rangeCheck(index);
Node<E> node=node(index);
if(index==0){
first=node.next;
}else{
Node<E> prev =node(index-1);
prev.next=node(index+1);
}
size--;
retuen node;
}
clear():清空链表
public void clear(){
first=null;
size=0;
}
set(int index,E element):修改结点位置的元素
public void set(int index,E element ){
rangeCheck(index);
Node<E> newnode=node(index);
newnode.element=element;
}
indexOf(E element):查看指定元素位置
public int indexOf(E element){
Node<E> node=first;
if(element==null){
for(int i=0;i<size;i++){
if(element==null)
return i;
}
}else{
for(int i=0;i<size;i++){
if(element.euqals(node.elemnet))return i;
}
}
return -1;
}
重写toString :
使用StringBuilder读取字符串效率更高
public String toString (){
StringBuilder sB=new StringBuilder();
sB.append("LinkedList:").append("{");
for (int i = 0; i < size; i++) {
if(i==0)sB.append(node(i).element);
else sB.append(",").append(node(i).element);
}
sB.append("}");
return sB.toString();
}
get(int index): 返回index对应的元素
public E get(int index) {
return node(index).element;
}
无头结点的缺点:
在一些方法中需要重新申请空间定义临时结点
本文介绍了如何在链表中进行有效的索引检查,包括越界检查、范围检查和针对添加操作的特殊处理。讲解了无头结点的实现及关键方法如节点获取、插入、删除、设置元素和查找元素等的实现细节。
5万+





