带哨兵的单向链表(改动版)
代码:
实现的功能:
1.头部添加
2.尾部添加
3.根据指定索引获得元素
4.向指定索引的位置添加元素
5.根据指定索引删除元素
import java.util.Iterator;
import java.util.function.Consumer;
public class SinglyLinkedList1 implements Iterable<Integer> {
//头节点
//带哨兵的单向链表
private Node head = new Node(666, null);
//节点类 内部类
private static class Node{//这个类相对独立,与外部类的变量没有关系,所有可以加static,能加则加
private int value;
private Node next;
public Node(int value, Node next)
{
this.value=value;
this.next=next;
}
}
//在头部进行添加元素
public void addFirst(int value){
insert(0,value);
}
//遍历元素
public Iterator<Integer> iterator() {
//匿名内部类 ->带名字
return new NodeIterator();
}
private class NodeIterator implements Iterator<Integer> {
Node p=head.next;//内部类使用外部类的变量,不能加static
@Override
public boolean hasNext() { //判断是否还有下一个元素
return p!=null;//返回真
}
@Override
public Integer next() {//返回当前元素,并指向下一个元素
int value=p.value;
p=p.next;
return value;
}
}
//找到最后一个元素
private Node findLast(){
Node p;
for(p=head;p.next!=null;p=p.next);
return p;
}
//在尾部添加元素
public void addLast(int value){
Node last=findLast();
last.next=new Node(value, null);
}
//获得索引
private Node findNode(int index){
int i=-1;
for(Node p=head;p!=null;p=p.next,i++){
if(i==index) return p;
}
return null;
}
//获得指定索引的元素
public int get(int index){
Node node=findNode(index);
if(node==null){
throw illegal(index);
}
return node.value;
}
private IllegalArgumentException illegal(int index) {
throw new IllegalArgumentException(String.format("索引[%d]不存在", index));
}
//向索引位置插入
public void insert(int index,int value){
Node prev= findNode(index-1);//找到要插入索引的前一个节点
if(prev==null) {
throw illegal(index);
}
prev.next = new Node(value, prev.next);
}
//删除第一个元素
public void removeFirst(){
remove(0);
}
//删除某个索引处的元素
public void remove(int index){
Node prev=findNode(index-1);
//超出索引
if(prev==null)
throw illegal(index);
Node remove=prev.next;
//链表只有一个元素时
if(remove==null)
throw illegal(index);
prev.next=remove.next;
}
}