Java单链表实现

Java如何单链表

  • 首先定义一个单链表类,将单链表看作是一个对象,在里面去实现链表的各种操作方法,最主要是其中定义了一个单链表节点的成员内部类(成员内部类可以无条件访问外部类的属性和方法,但是外部类想要访问内部类属性或方法时,必须要创建一个内部类对象,然后通过该对象访问内部类的属性或方法)。
package Stack;

import org.junit.jupiter.api.Test;

//单链表类
class SingleLinkList{
    //声明链表
    private LinkNode head;//头节点
    private int size;

    //定义单链表节点 私有内部类
    private class LinkNode{
        private Object data;
        private LinkNode next;//指向下一个节点

        public  LinkNode(Object e){
            this.data=e;
        }
    }

    //定义构造函数初始化
    public SingleLinkList(){
        size=0;
        head=null;
    }

    //头插法加入节点
    public Object addHead(Object obj){
        LinkNode newNode = new LinkNode(obj);
        if(size==0){
            head = newNode;
        }else{
            newNode.next = head;
            head.next = newNode;//应该是head = netNode; 头指针让位。
        }

        size++;
        return obj;
    }

    //返回找到数据的节点
    public LinkNode Find(Object obj){
        LinkNode current = head;
        int tmpSize = size;//采用临时的变量计数
        while(tmpSize>0){
            if(current.data==obj){
                return current;
            }else{

                current = current.next;
            }
            tmpSize--;
        }


        return null;
    }
    public boolean delNode(Object obj){
        if(size==0){
            return false;
        }
        LinkNode current = head;
        LinkNode p = head;
        while(current.data!=obj){
            if(current==null){
                return false;
            }else {
                p =current;
                current = current.next;
            }
        }
        //经过while循环如果找到就会执行下面的代码,否则就会查找失败

        if(current==head){
            head=current.next;
        }else{
            p.next=current.next;//删除current节点
        }
        size--;//节点个数减一
        return true;

    }
    public boolean isEmpty(){
        return (size==0);
    }

    //显示节点
    public void display(){
        if(size>0){
            LinkNode node = head;
            int tmpSize = size;
            if(tmpSize==1){
                System.out.println("["+node.data+"]");
                return;
            }

            while (tmpSize>0){
                if(node.equals(head)){
                    System.out.println("["+node.data+"->");
                }else if(node==null)//node是分配了地址空间,node的下一个指向应该是为空  即node.next==null{
                    System.out.println(node.data+"]");
                }else {
                    System.out.println(node.data+"->");
                }

                node = node.next;
                tmpSize--;
            }

        }else {
            System.out.println("[ ]");
        }

    }

}




public class Structure01 {

    public static void main(String[] args) {
        SingleLinkList singleList = new SingleLinkList();
        singleList.addHead("A");
        singleList.addHead("B");
        singleList.addHead("C");
        singleList.addHead("D");
        //打印当前链表信息
        singleList.display();
        //删除C
        singleList.delNode("C");
        singleList.display();
        //查找B
        System.out.println(singleList.Find("B"));
    }
}
全部评论

相关推荐

听说改名字就能收到offer哈:Radis写错了兄弟
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务