Java不支持泛型数组。
使用泛型来规定链表中元素的类型。
DLinkList接口:
package cn.ltp.dlinklist;
/**
* 双向链表
* @author Z7M-SL7D2
*
*/
interface DLinkList<T> {
/**
* 添加节点
* @param data 节点的数据
*/
void add(T data);
/**
* 删除节点
* @param data 节点的数据
*/
void remove(T data);
/**
* 修改位于index位置的节点
* @param index 节点所在位置
* @param data 节点的数据
*/
void set(int index, T data);
/**
* 获取位于index位置节点的数据
* @param index 节点所在位置
* @return
*/
T get(int index);
/**
* 获取节点个数
* @return
*/
int getSize();
/**
* 是否包含某个节点
* @param data 数据
* @return
*/
boolean contains(T data);
/**
* 打印节点
*/
void printList();
/**
* 判空
* @return
*/
boolean isEmpty();
/**
* 清空
*/
void clear();
/**
* 转数组
* @return
*/
Object[] toArray();
}
实现
package cn.ltp.dlinklist;
public class DLinkListImpl<T> implements DLinkList<T> {
private Node first;
private Node last;
private int size;
private class Node {
private Node next;
private Node prev;
private T data;
private Node(Node next, Node prev, T data) {
super();
this.next = next;
this.prev = prev;
this.data = data;
}
}
@Override
public void add(T data) {
if (first == null) {
Node node = new Node(null, null, data);
first = node;
last = node;
} else {
Node node = new Node(null, last, data);
last.next = node;
last = node;
}
this.size++;
}
@Override
public void remove(T data) {
if (data == null) {
for (Node cur = this.first; cur != null;) {
Node tmp = cur.next;
if (cur.data == null) {
if (cur == first) {
if (cur == last) {
cur = null;
} else {
first = cur.next;
cur.next = null;
cur = null;
first.prev = null;
cur = first;
}
} else if (cur == last) {
last = cur.prev;
cur.prev = null;
cur = null;
last.next = null;
cur = tmp;
} else {
cur.prev.next = cur.next;
cur.next.prev = cur.prev;
cur.next = null;
cur.prev = null;
cur = null;
cur = tmp;
}
this.size--;
} else {
cur = cur.next;
}
}
} else {
for (Node cur = this.first; cur != null;) {
Node tmp = cur.next;
if (data.equals(cur.data)) {
if (cur == first) {
if (cur == last) {
cur = null;
} else {
first = cur.next;
cur.next = null;
cur = null;
first.prev = null;
cur = first;
}
} else if (cur == last) {
last = cur.prev;
cur.prev = null;
cur = null;
last.next = null;
cur = tmp;
} else {
cur.prev.next = cur.next;
cur.next.prev = cur.prev;
cur.next = null;
cur.prev = null;
cur = null;
cur = tmp;
}
this.size--;
} else {
cur = cur.next;
}
}
}
}
@Override
public void set(int index, T data) {
Node node = node(index);
if (node != null)
node.data = data;
}
@Override
public T get(int index) {
Node node = node(index);
if (node != null)
return node.data;
else {
try {
throw new NullPointerException();
} catch (NullPointerException e) {
System.out.println("Null:no such element");
return null;
}
}
}
@Override
public int getSize() {
return this.size;
}
private Node node(int index) {
if (index >= this.size)
return null;
int len = this.size;
if (index < len) {
if (index > len / 2) {
Node cur = last;
int step = len - index - 1;
while (step-- > 0) {
cur = cur.prev;
}
return cur;
} else {
Node cur = first;
int step = index;
while (step-- > 0) {
cur = cur.next;
}
return cur;
}
}
return null;
}
@Override
public void printList() {
int count = this.size;
Node cur = first;
System.out.print("打印链表元素:");
while (count-- > 0) {
System.out.print(" " + cur.data);
cur = cur.next;
}
System.out.println();
}
@Override
public boolean contains(T data) {
if (data == null) {
for (Node cur = this.first; cur != null; cur = cur.next) {
if (cur.data == null)
return true;
}
} else {
for (Node cur = this.first; cur != null; cur = cur.next) {
if (data.equals(cur.data))
return true;
}
}
return false;
}
@Override
public boolean isEmpty() {
return this.size <= 0;
}
@Override
public void clear() {
Node cur = first;
Node tmp = null;
while (cur != null) {
tmp = cur.next;
cur.next = null;
cur.prev = null;
cur = tmp;
}
first = last = null;
this.size = 0;
}
@Override
public Object[] toArray() {
if (size <= 0)
return null;
// 不支持泛型数组
Object[] arr = new Object[this.size];
int i = 0;
for (Node cur = first; cur != null; cur = cur.next, i++)
arr[i] = cur.data;
return arr;
}
}
测试:
package cn.ltp.dlinklist;
public class Test {
public static void main(String[] args) {
Factory factory = new Factory();
DLinkList<Number> dList = factory.getInstance();
dList.add(6);
dList.add(2);
dList.add(3);
dList.add(6);
dList.add(7.5);
dList.add(6);
dList.add(6);
dList.add(null);
dList.add(6);
dList.add(null);
dList.printList();
System.out.println("是否包含元素100:" + dList.contains(100));
System.out.println("第9个元素为" + dList.get(9));
System.out.println("删除链表为空的元素:");
dList.remove(null);
dList.printList();
System.out.println("删除链表为6的元素:");
dList.remove(6);
dList.printList();
Object[] arr = dList.toArray();
System.out.println("转数组");
for(Object object : arr)
System.out.print(object + " ");
System.out.println("\n清空数组");
dList.clear();
dList.printList();
}
}
使用Number类,可以添加所有的数值类型的元素