一、建立節點類
//節點類
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"));
}
}
五、運行結果