一、建接口
//线性表接口的定义
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 DoubleLinkedList implements MyList {
private ListNode first=new ListNode(null);//头节点
private ListNode last=new ListNode(null);//尾节点
private int size;//记录链表中元素的个数
public DoubleLinkedList() {
first.next=last;
last.pre=first;
}
@Override
public void add(Object element) {
ListNode newNode=new ListNode(element);
last.pre.next=newNode;
newNode.next=last;
newNode.pre=last.pre;
last.pre=newNode;
size++;
}
@Override
public void delete(Object element) {
ListNode p=first.next;
while(p!=last) {
if(p.data.equals(element)) {
p.pre.next=p.next;
p.next.pre=p.pre;
p.next=null;
p.pre=null;
size--;
break;
}
p=p.next;
}
}
@Override
public void deleteByIndex(int index) {
if(index<0||index>=size) {
return ;
}
int i=0;//记录指向的节点的索引
ListNode p=first;
while(p!=null) {
if(i==index) {
p.pre.next=p.next;
p.next.pre=p.pre;
p.next=null;
p.pre=null;
size--;
break;
}
p=p.next;
i++;
}
size--;
}
@Override
public void update(int index, Object newElement) {
int i=0;//记录指向的节点的索引
ListNode p=first.next;//第一个有内容元素
while(p!=last) {
if(i==index) {
p.data=newElement;
}
p=p.next;
i++;
}
}
@Override
public boolean contains(Object target) {
ListNode p=first.next;
while(p!=last) {
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.next;
while(p!=last) {
if(i==index) {
return p.data;
}
p=p.next;
i++;
}
return null;
}
@Override
public int indexOf(Object element) {
int i=0;//记录指向的节点的索引
ListNode p=first.next;
while(p!=last) {
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.next;//赋值头结点
while(p!=last) {
sb.append(p.data);
if(p.next!=last)
sb.append(",");
p=p.next;
}
sb.append("]");
return sb.toString();
}
}
三、建测试类
public class MyDoubleLinkedListTest{
public static void main(String[] args) {
DoubleLinkedList list=new DoubleLinkedList();
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(0));
System.out.println(list.indexOf("b"));
System.out.println(list);
}
}
四、运行结果