链表图:
删除的逻辑
单链表类实现:
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
try {
while (!e.equals(tempNode.data)){
//记录当前节点
preNode=tempNode;
//更新遍历的节点信息为下一节点
tempNode= tempNode.next;
}
}catch (NullPointerException exception){
System.out.println("链表中没有此数据:"+e);
return;
}
//找到了数据区为 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;
}
}
}
测试类:
public class SingelLinkedListTest {
public static void main(String[] args) {
SingleLinkedList<String> sll=new SingleLinkedList<>();
System.out.println("sll.size() = " + sll.size());
sll.add("张三");
sll.add("李四");
sll.add(null);
sll.add("王五");
System.out.println("sll.size() = " + sll.size());
System.out.println(sll);
sll.remove(null);
sll.remove("李四");
System.out.println(sll);
}
}
这里只实现了增加和删除的方法,可以基于remove方法增加一个set方法,用来修改链表的值。
Python实现单链表请点击这里