Java 实现单链表原理
原理图
java实现逻辑,由此可推断出双链表的逻辑
package com.icbc.common;
import java.io.Serializable;
import java.util.Iterator;
/**
* @author Kaki Nakajima
* @date 2019.05.24
* @desc 单链表
*
*/
public class SingleLink implements Iterable, Serializable {
private class Node{
Object data;
Node next;
}
//头节点
private Node head;
//上一个节点
private Node prev;
//新增数据
public void add (Object data){
//创建新节点
Node node = new Node();
//将数据放到节点中
node.data = data;
//连接到链表中
if(head == null){
//添加至头节点
head = node;
}else {
//添加至尾节点
Node lastNode = findLastNode();
//把源尾部节点地址指向当前新数据
lastNode.next = node;
}
}
//删除数据
public boolean remove(Object o){
Node node = find(o);
return remove(node);
}
//删除逻辑:如果该数据时头节点,那头节点就等于下一个节点。如果该数据不是头节点,那就让他上一个数据指向他的下一个数据。
//没有被变量指引的数据将被GC回收
private boolean remove(Node node){
if (node != null){
if(node==head){
head = head.next;
}else {
prev.next = node.next;
}
return true;
}else {
return false;
}
}
public boolean isEmpty(){
return head == null;
}
public boolean contains(Object o){
return find(o) != null;
}
//查找数据节点
private Node find(Object o){
Node temp = head;
prev = temp;
while (temp != null){
if(temp.data.equals(o)&&temp.hashCode() == o.hashCode() ){
//找到数据
break;
}else {
prev = temp;
temp = temp.next;
}
}
return temp;
}
//查询尾节点
private Node findLastNode(){
Node temp = head;
while (temp !=null){
if(temp.next == null){
break;
}else {
temp = temp.next;
}
}
return temp;
}
@Override
public Iterator iterator() {
class MyIterator implements Iterator{
Node temp = head;
Node prev = temp;
@Override
public boolean hasNext() {
return temp!=null;
}
@Override
public Object next() {
Object data = temp.data;
SingleLink.this.prev = prev;
prev = temp;
temp = temp.next;
return data;
}
}
return new MyIterator();
}
}
欢迎点赞关注收藏哦 ,码云搜索KakiNakajima