public class SingleLinkedList<E> {
//链表头节点指针区
private Node head;
//链表头节点数据区
private Object data;
//记录链表节点个数
private int count;
public void remove(E e){
//null 要单独使用==判断
if (e==null){
//头结点指针区为null,只有一个元素,直接赋值为null交给GC处理
if (head.next==null){
head.data=null;
}else {
//至少存在两个以上元素,定义变量保存当前遍历的节点,从头结点遍历
Node tempNode=head;
//定义变量记录上一节点,头结点非空,至少从第二个以后的节点才出现数据区为null
Node preNode=head;
//当前遍历节点数据区不为null
while (tempNode.data!=null){
//记录当前节点
preNode=tempNode;
//更新遍历的节点信息为下一节点
tempNode= tempNode.next;
}
//找到了数据区为null的节点保存在tempNode中,且上一节点保存在preNode中
//将上一节点指针区信息更新为找到的节点的指针区信息,即让上一节点取代当前数据区为null节点的位置指向后面的节点
preNode.next=tempNode.next;
//将数据区为null的节点中指针区设为null,交给GC处理
tempNode.next=null;
}
//更新链表个数
count--;
}else {
if (e.equals(head.data)){
head.data=null;
}else {
//至少存在两个以上元素,定义变量保存当前遍历的节点,从头结点遍历
Node tempNode=head;
//定义变量记录上一节点,头结点非空,至少从第二个以后的节点才出现数据区为 e 的节点
Node preNode=head;
//当前遍历节点数据区不为 e
while (!e.equals(tempNode.data)){
//记录当前节点
preNode=tempNode;
//更新遍历的节点信息为下一节点
tempNode= tempNode.next;
}
//找到了数据区为 e 的节点保存在tempNode中,且上一节点保存在preNode中
//将上一节点指针区信息更新为找到的节点的指针区信息,即让上一节点取代当前数据区为 e 节点的位置指向后面的节点
preNode.next=tempNode.next;
//将数据区为 e 的节点中指针区设为null,交给GC处理
tempNode.next=null;
}
//更新链表个数
count--;
}
}
//链表add方法
public void add(E e) {
//先创建一个新节点保存数据
Node newNode = new Node(e, null);
if (head == null) {
head = newNode;
} else {
//临时保存节点信息
Node tempNode = head;
while (tempNode.next != null) {
//更新节点信息,指向下一节点
tempNode = tempNode.next;
}
tempNode.next = newNode;
}
count++;
}
public int size() {
return count;
}
@Override
public String toString() {
Object[] obj = new Object[count];
Node tempNode = head;
for (int j = 0; j < count; j++) {
obj[j] = tempNode.data;
tempNode = tempNode.next;
}
return Arrays.toString(obj);
}
//链表节点
private class Node {
//数据存储区
private Object data;
//指针区
private Node next;
public Node(Object data, Node next) {
this.data = data;
this.next = next;
}
}
}
这里只实现了增加和删除的方法,可以基于remove方法增加一个set方法,用来修改链表的值。