JAVA模拟单链表
隔一段时间写一遍加强熟练度
import java.util.Iterator;
public class OneLink<E> implements Iterable<E>{
private Node<E> first;
private int size;
public void add(E e) { //尾部插入
Node<E> newNode = new Node<>(e,null);
if (first == null) {
first = newNode;
}else {
Node node = first;
while (node.next != null) { // 最后一个节点的特点.next = null
node = node.next;
}
// 循环结束时 node.next == null
node.next = newNode;
}
size ++;
}
public void remove(Object obj) {
if (first == null) {
return;
}
// 查找被删除目标结点
Node node = first;
Node before = null;
if (obj == null) { // obj是否为空
while (node != null) {
if (node.data == null) { //这个点的值
break;
}
before = node;
node = node.next;
}
}else {
while (node != null) {
if (obj.equals(node.data)) { //这个点的值
break;
}
before = node;
node = node.next;
}
}
// 如果全部找完 都没有找到 node == null
if (node == null){ // 不存在被删除的目标 return
return;
}
// 找到被删除的结点 分两种情况 是第一个结点 不是第一个结点
if (before == null) {
first = node.next;
}else {
before.next = node.next;
}
node.next = null;
node.data = null;
size --;
}
@Override
public Iterator<E> iterator() { // 返回一个iterator对象
return new Itr();
}
private class Itr implements Iterator<E> { // 实现Iterator接口的class
// 生成游标
Node node = first;
@Override
public boolean hasNext() {
return node != null;
}
@Override
public E next() {
E data = (E) node.data;
node = node.next;
return data;
}
}
private static class Node<E> {
E data;
Node<E> next;
public Node(E data, Node<E> next) {
this.data = data;
this.next = next;
}
}
}
测试 TestOneLink
import java.util.Iterator;
public class TestOneLink {
public static void main(String[] args) {
OneLink<String> list = new OneLink<>();
list.add("hello");
list.add("python1");
list.add("java");
list.add("python2");
list.add("world");
for (String s : list) {
System.out.println(s);
}
list.remove("python1");
list.remove("python2");
System.out.println("-------------");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}