链表(LinkedList):有头结点和没有头结点(一)

本文介绍了如何在链表中进行有效的索引检查,包括越界检查、范围检查和针对添加操作的特殊处理。讲解了无头结点的实现及关键方法如节点获取、插入、删除、设置元素和查找元素等的实现细节。

链表的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;
    }

无头结点的缺点:
在一些方法中需要重新申请空间定义临时结点

评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值