接口中定义要实现的功能
interface ILink {
/**
* 链表增加节点操作
* @param data 节点内容
* @return
*/
boolean add(Object data);
/**
* 判断指定内容节点在链表中是否存在
* @param data 要判断的内容
* @return 返回找到的节点索引
*/
int contains(Object data);
/**
* 删除指定内容节点
* @param data
* @return
*/
boolean remove(Object data);
/**
* 根据指定下标修改节点内容
* @param index 索引下标
* @param newData 替换后的内容
* @return 替换之前的节点内容
*/
Object set(int index,Object newData);
/**
* 根据指定下标返回节点内容
* @param index
* @return
*/
Object get(int index);
/**
* 链表清空
*/
void clear();
/**
* 将链表转为数组
* @return 返回所有节点内容
*/
Object[] toArray();
/**
* 链表长度
* @return
*/
int size();
/**
* 遍历链表
*/
void printLink();
}
方法的具体实现
class LinkImpl implements ILink{
private Node head;
private Node last;
private int size;
private class Node{//内部类与外部类可以彼此访问私有域
private Node prev;
private Object data;
private Node next;
public Node(Node prev,Object data,Node next){
this.prev = prev;
this.data = data;
this.next = next;
}
}
public boolean add(Object data){
Node temp = this.last;
Node newNode = new Node(temp,data,null);
this.last = newNode;
if(head == null){
this.head = newNode;
}else{
temp.next = newNode;
}
this.size++;
return true;
}
public int contains(Object data){
if(data == null){
int i = 0;
for(Node temp = head;temp!=null;temp = temp.next){
if(temp.data == null){
return i;
}
i++;
}
}else{
int i = 0;
for(Node temp = head;temp!=null;temp = temp.next){
if(temp.data.equals(data)){
return i;
}
i++;
}
}
return -1;
}
public boolean remove(Object data){
if(data == null) {
for (Node temp = head; temp != null; temp = temp.next) {
if (temp.data == null) {
unLike(temp);
return true;
}
}
}
else{
for(Node temp = head;temp!=null;temp = temp.next){
if(temp.data.equals(data)){
unLike(temp);
return true;
}
}
}
return false;
}
/**
* 删除节点内容
* @param x
* @return
*/
private Object unLike(Node x){
Object elementData = x.data;
Node prev = x.prev;
Node next = x.next;
if(prev == null){
this.head = next;
}else{
prev.next = next;
x.prev = null;
}
if(next == null){
this.last = prev;
}else{
next.prev = prev;
x.next = null;
}
x.data = null;
this.size--;
return elementData;
}
public Object set(int index,Object newData){
if(!isLinkIndex(index)){
return null;
}
Node node = node(index);
Object element = node.data;
node.data = newData;
return element;
}
public Object get(int index){
if(!isLinkIndex(index)){
return null;
}
Node node = node(index);
return node.data;
}
/**
* 根据指定索引取得具体节点
*/
private Node node(int index){
if(index < (size>>1)){
Node temp = this.head;
for(int i=0;i<index;i++){
temp = temp.next;
}
return temp;
}
Node temp = this.last;
for(int i=size-1;i>index;i--){
temp = temp.prev;
}
return temp;
}
/**
* 判断索引是否合法
*/
private boolean isLinkIndex(int index){
return index>=0 && index<size;
}
public void clear(){
for(Node temp = head;temp!=null;){
temp.data = null;
Node node = temp.next;
temp = temp.next = temp.prev = null;
temp = node;
this.size --;
}
}
public Object[] toArray(){
Object[]result = new Object[size];
int i = 0;
for(Node temp = head;temp!=null;temp = temp.next){
result[i++] = temp.data;
}
return result;
}
public int size(){
return this.size;
}
public void printLink(){
Object []data = this.toArray();
for(Object temp:data){
System.out.println(temp);
}
}
}
测试
public class Test{
public static void main(String[] args) {
ILink link = new LinkImpl();
link.add("火车头");
link.add("车厢1");
link.add("车厢2");
link.add("车厢尾");
System.out.println(link.remove("车厢1"));
link.printLink();
}
}