原文地址:http://www.tianshouzhi.com/api/tutorials/basicalgorithm/44
原文中SingleLinkList的remove方法有问题,因为是” Node current=firstNode.getNext();”,所以导致链表的第一个节点删不掉。
修改如下:
public class SingleLinkList<T> {
// 链表中第一个节点
protected Node firstNode = null;
// 链表中维护的节点总量
protected int size;
/**
* 每次添加都是添加到最前面
* @param element
*/
public void addFirst(T element){
Node node = new Node();
node.setData(element);
node.setNext(firstNode);
firstNode = node;
size++;
}
/**
* 删除某个节点
* @param element
* @return 删除成功返回true,失败返回false
*/
public boolean remove(T element){
if(size == 0){
return false;
}
if(element.equals(firstNode.getData())){ // 如果删除首节点
Node temp = firstNode;
firstNode = firstNode.getNext();
temp = null;
size--;
return true;
}
// 如果删除除首节点之外的其他节点
Node pre = firstNode;
Node current = pre.getNext();
while(current != null){
if((current.getData() == null && element == null) ||
(element.equals(current.getData()))){
pre.setNext(current.getNext()); // 删除这个节点,将上一个节点指向这个节点的下一个节点
current = null;
size--;
return true;
}
pre = current; // 如果不是,上一个节点指向这个节点
current = current.getNext();
}
return false;
}
/**
* 是否包含某个元素
* @param element
* @return 包含返回true,否则返回false
*/
public boolean contains(T element){
if(size == 0){
return false;
}
Node current = firstNode;
while(current != null){
if((current.getData() == null && element == null) ||
(element.equals(current.getData()))){
return true;
}
current = current.getNext();
}
return false;
}
public boolean isEmpty(){
return size == 0;
}
public int size(){
return size;
}
/**
* 打印出所有的元素
*/
public void display(){
if(!isEmpty()){
Node current = firstNode;
while(current != null){
System.out.print(current.getData() + "\t");
current = current.getNext();
}
}
}
}