JAVA 使用头尾节点实现单链表(简洁版)

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;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值