单链表增删查改
//Sequence.java
public interface Sequence {
/**
* 向线性表中添加元素
* @param data 要存储的元素
*/
void add(Object data);
/**
* 线性表中删除元素
* @param index 要删除的元素下标
* @return 是否删除成功
*/
boolean remove(int index);
/**
* 在线性表中查找指定索引的元素
* @param index 要查找的索引
* @return
*/
Object get(int index);
/**
* 判断线性表中是否有指定元素
* @param data 要查找的元素内容
* @return
*/
boolean contains(Object data);
/**
* 修改线性表中指定索引的内容
* @param index 要修改的元素下标
* @param newData 修改后的内容
* @return
*/
Object set(int index,Object newData);
/**
* 返回当前线性表元素个数
* @return
*/
int size();
/**
* 直接清空线性表内容
*/
void clear();
/**
* 将线性表转为数组
* @return
*/
Object[] toArray();
}
//LinkedList.java
public class LinkedList implements Sequence {
private ListNode head;
private int size;
class ListNode{
ListNode next;
Object val;
public ListNode(ListNode next,Object val){
this.next=next;
this.val=val;
}
public ListNode(Object data){
this.val=data;
}
}
@Override
public void add(Object data) {//增
ListNode node=new ListNode(head,data);
head=node;//头插法只知道头指针
size++;
}
@Override
public boolean remove(int index) {//删除
if(head==null){
return false;
}
rangeCheck(index);//判断下标是否合法
ListNode dummyHead=new ListNode(-1);//设立虚拟头节点,使操作统一(所有节点均有前驱结点)
dummyHead.next=head;
ListNode prev=dummyHead;//为了找到前驱节点
for(int i=0;i<index;i++){
prev=prev.next;
}
ListNode node=node(index);//找到指定下标节点
prev.next=node.next;//前驱节点指向后继节点
size--;
return true;
}
@Override
public Object get(int index) {//找到指定下标节点
rangeCheck(index);
return node(index).val;
}
@Override
public boolean contains(Object data) {//查 查找链表中是否存在指定元素
for(ListNode temp=head;temp!=null;temp=temp.next){
if(temp.val==data){
return true;
}
}
return false;
}
@Override
public Object set(int index, Object newData) {//改 修改指定下标节点数据
rangeCheck(index);
Object oldData=node(index).val;
node(index).val=newData;
return oldData;
}
@Override
public int size() {
return this.size;
}
@Override
public void clear() {//清空
for(ListNode temp=head;temp!=null;temp=temp.next){
if(head.next!=null){
head=head.next;
head.val=null;
}else{
head.val=null;
}
size--;
}
}
@Override
public Object[] toArray() {
Object[] data=new Object[size];
int i=0;
for(ListNode temp=head;temp!=null;temp=temp.next){
data[i++]=temp.val;
}
return data;
}
public void display(){//打印
for(ListNode temp=head;temp!=null;temp=temp.next){
System.out.print(temp.val+" ");
}
}
private void rangeCheck(int index){
if(index<0||index>=size){
throw new IndexOutOfBoundsException("下标越界异常");
}
}
private ListNode node(int index){//找到指定下标节点
ListNode prev=head;
for(int i=0;i<index;i++){
prev=prev.next;
}
return prev;
}
}
//Test.java
public class Test {
public static void main(String[] args) {
LinkedList linkedList=new LinkedList();
linkedList.add(1);
linkedList.add(2);
linkedList.add(3);
linkedList.add(4);
linkedList.display();
System.out.println();
System.out.println(linkedList.get(2));
linkedList.set(2,888);
System.out.println(linkedList.get(2));
System.out.println(linkedList.contains(4));
System.out.println(linkedList.contains(999));
linkedList.remove(1);
System.out.println(linkedList.size());
linkedList.display();
System.out.println();
linkedList.clear();
System.out.println(linkedList.size());
}
}
运行结果: