1、实现单链表的增删改查
2、防环锁 造成死循环
3、效率不高
5、实现简单,理解链表原理
6、使用Iterable使用循环遍历
package com.acwer.queue;
import java.util.Iterator;
public class SingleLinkedDemo {
public static void main(String[] args) {
HeroNode 公孙胜 = new HeroNode(4, "公孙胜", "入云龙");
SingleLinked linked=new SingleLinked();
linked.add(new HeroNode(1,"宋江","呼保义"));
linked.add(new HeroNode(2,"卢俊义","天罡星"));
linked.add(new HeroNode(3,"吴用","天机星"));
linked.add(公孙胜);
linked.add(4,new HeroNode(5,"小明","小明"));
linked.add(new HeroNode(6,"小明2","小明2"));
linked.add(10,new HeroNode(10,"小明10","小明10"));
linked.remove(linked.getSize()-2);
公孙胜.setName("公孙胜2");
linked.modify(公孙胜);
System.out.println("================");
for (HeroNode heroNode : linked) {
System.out.println(heroNode);
}
}
}
class SingleLinked implements Iterable<HeroNode>{
//头节点
private HeroNode head=new HeroNode(0,"","");
//尾节点
private HeroNode tail=head;
private int size=0;
public int getSize(){
return size;
}
//在链尾添加一个节点
public void add(HeroNode node){
//防止重复添加,造成环锁
if(container(node)) return;
tail.setNext(node);
tail=tail.getNext();
size++;
}
public boolean container(HeroNode node){
if(empty()) return false;
HeroNode next = head.getNext();
do {
if(node==next) return true;
next=next.getNext();
}while (next!=null);
return false;
}
/**
* 修改某个节点
* @param node
* @return
*/
public boolean modify(HeroNode node){
HeroNode next = head.getNext();
HeroNode pre=head;
do {
if(node==next){
pre.setNext(node);
return true;
}
pre=next;
next=next.getNext();
}while (next!=null);
return false;
}
/**
* 插入一个节点到某个节点之后
* @param index
* @param node
*/
public void insert(int index,HeroNode node){
add(index,node);
}
/**
* 按插入到指定滴index后
* 规则:如果下标越界,直接添加到后面
* @param index
* @param node
*/
public void add(int index,HeroNode node){
//防止重复添加,造成环锁
if(container(node)) return;
//如果当前链表为空,就直接加到链尾
if(empty()){
add(node);
return;
}
//遍历链表,找到相关的位置
int tmpIndex=1;
HeroNode next = head;
boolean ido=false;
do {
//找到相应的位置
if(index<tmpIndex){
HeroNode next1 = next.getNext();
node.setNext(next1);
next.setNext(node);
size++;
ido=true;
break;
}
tmpIndex++;
next=next.getNext();
}while (next!=null);
if(ido){
if(size==tmpIndex){
tail=node;
}
}else{
add(node);
}
}
public boolean remove(HeroNode node){
if(empty()) return false;
HeroNode next = head.getNext();
HeroNode pre=head;
boolean rm=false;
for (;;){
if(next==node){
HeroNode currentNode = pre.getNext();
HeroNode next1 = next.getNext();
pre.setNext(next1);
//help GC
if(currentNode!=null){
currentNode.setNext(currentNode);
}
rm=true;
}
pre=next;
next=next.getNext();
if(next==null) break;
}
if(rm){
size--;
//如果此节点是个尾节点
if(pre.getNext()==null){
tail=pre;
}
}
return rm;
}
public boolean remove(int index){
//下标越界,不成功
if(empty()||index>=size) return false;
int tmpIndex=0;
//下一个节点
HeroNode next = head.getNext();
//当前节点的前一个节点
HeroNode pre=head;
boolean rm=false;
do {
if(index==tmpIndex){
HeroNode currentNode = pre.getNext();
HeroNode secondNext = next.getNext();
pre.setNext(secondNext);
if(currentNode!=null){
//help GC
currentNode.setNext(currentNode);
}
size--;
rm=true;
break;
}
tmpIndex++;
pre=next;
next=next.getNext();
}while (next!=null);
if(tmpIndex==size){
tail=pre;
}
return rm;
}
/**
* 列表显示
*/
public void list(){
for (HeroNode heroNode : this) {
System.out.println(heroNode);
}
}
public boolean empty(){
return tail==head;
}
@Override
public Iterator<HeroNode> iterator() {
class HerNodeIterator implements Iterator<HeroNode>{
private HeroNode myhead;
public HerNodeIterator(HeroNode head){
this.myhead=head;
}
@Override
public boolean hasNext() {
return myhead!=null;
}
@Override
public HeroNode next() {
HeroNode tmp=myhead;
myhead=myhead.getNext();
return tmp;
}
}
return new HerNodeIterator(head.getNext());
}
}
class HeroNode{
private int no;
private String name;
private String nick;
private HeroNode next;
public HeroNode(int no, String name, String nick) {
this.no = no;
this.name = name;
this.nick = nick;
}
@Override
public String toString() {
return "HeroNode{" +
"no=" + no +
", name='" + name + '\'' +
", nick='" + nick + '\'' +
'}';
}
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNick() {
return nick;
}
public void setNick(String nick) {
this.nick = nick;
}
public HeroNode getNext() {
return next;
}
public void setNext(HeroNode next) {
this.next = next;
}
}