一、建立节点类
//节点类
public class ListNode {
Object data;// 可见范围为同一个包,不用提供set和get方法
ListNode next;
public ListNode(Object data) {
this.data = data;
}
}
二、建立接口
//线性表接口的定义
public interface MyList {
void add(Object element);//新增一个元素
void delete(Object element);//删除相同元素
void deleteByIndex(int index);//根据索引删除元素
void update(int index,Object newElement);//将指定索引位置的元素替换成新元素
boolean contains(Object target);//当前列表中是否含有target元素
Object at(int index);//根据指定索引返回元素
int indexOf(Object element);//查找element所在的索引,如果没有返回-1
}
三、建立实现类
public class SingleLinkedList implements MyList {
private ListNode first;//头节点
private ListNode last;//尾节点
private int size;//记录链表中元素的个数
@Override
public void add(Object element) {
if (first == null) {
first = new ListNode(element);
last=first;
}else {
last.next=new ListNode(element);
last=last.next;
}
size++;
}
@Override
public void delete(Object element) {
ListNode p=first;
ListNode pre=null;
while(p!=null) {
if(p.data.equals(element)) {
if(p==first) {
first=first.next;
}else {
pre.next=p.next;
}
break;//删掉了不用往后走了
}
pre=p;
p=p.next;
}
size--;
}
@Override
public void deleteByIndex(int index) {
if(index<0||index>=size) {
return ;
}
int i=0;//记录指向的节点的索引
ListNode p=first;
ListNode pre=null;
while(p!=null) {
if(i==index) {
if(p==first) {
first=first.next;
}else {
pre.next=p.next;
}
break;//删掉了不用往后走了
}
pre=p;
p=p.next;
i++;
}
size--;
}
@Override
public void update(int index, Object newElement) {
int i=0;//记录指向的节点的索引
ListNode p=first;
ListNode pre=null;
while(p!=null) {
if(i==index) {
p.data=newElement;
}
pre=p;
p=p.next;
i++;
}
}
@Override
public boolean contains(Object target) {
ListNode p=first;
while(p!=null) {
if(p.data.equals(target)) {
return true;
}
p=p.next;
}
return false;
}
@Override
public Object at(int index) {
if(index<0||index>=size) {
return null;
}
int i=0;//记录指向的节点的索引
ListNode p=first;
while(p!=null) {
if(i==index) {
return p.data;
}
p=p.next;
i++;
}
return null;
}
@Override
public int indexOf(Object element) {
int i=0;//记录指向的节点的索引
ListNode p=first;
while(p!=null) {
if(p.data.equals(element)) {
return i;
}
p=p.next;
i++;
}
return -1;
}
//为了测试,重写toString
@Override
public String toString() {
StringBuilder sb=new StringBuilder("[");
ListNode p=first;//赋值头结点
while(p!=null) {
sb.append(p.data);
if(p.next!=null)
sb.append(",");
p=p.next;
}
sb.append("]");
return sb.toString();
}
}
四、建立测试类
public class MyLinkedListTest{
public static void main(String[] args) {
SingleLinkedList list=new SingleLinkedList();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
list.add("f");
list.delete("d");
list.deleteByIndex(4);
list.update(0, "x");
System.out.println(list.contains("a"));
System.out.println(list.at(3));
System.out.println(list.indexOf("b"));
}
}
五、运行结果