JAVA实现链表查找函数错误

删减的函数都没有带static,只有查找的函数报了静态的错误。
find函数加上static又会报Node无法引用,需要去掉static的错误。

package LinkedList;

public class Linked {

private class Node{
    private T t;
    private Node next;
    public Node(T t,Node next){
        this.t = t;
        this.next = next;
    }
    public Node(T t){
        this(t,null);
    }
}
private Node head;            //头结点
private int size;            //链表元素个数
private int n;              //寻找元素个数
//构造函数
public Linked(){
    this.head = null;
    this.size = 0;
    this.n = 0;
}

//获取链表元素的个数
public int getSize(){
    return this.size;
}
//判断链表是否为空
public boolean isEmpty(){
    return this.size == 0;
}
//链表头部添加元素
public void addFirst(T t){
    Node node = new Node(t);    //节点对象
    node.next = this.head;
    this.head = node;
    this.size++;
}
//向链表尾部插入元素
public void addLast(T t){
    this.add(t, this.size);
}
//向链表中间插入元素
public void add(T t,int index){
    if (index <0 || index >size){
        throw new IllegalArgumentException("index is error");
    }
    if (index == 0){
        this.addFirst(t);
        return;
    }
    Node preNode = this.head;
    //找到要插入节点的前一个节点
    for(int i = 0; i < index-1; i++){
        preNode = preNode.next;
    }
    Node node = new Node(t);
    //要插入的节点的下一个节点指向preNode节点的下一个节点
    node.next = preNode.next;
    //preNode的下一个节点指向要插入节点node
    preNode.next = node;
    this.size++;
}

//删除链表元素
public void remove(T t){
    if(head == null){
        System.out.println("无元素可删除");
        return;
    }
    //要删除的元素与头结点的元素相同
    while(head != null && head.t.equals(t)){
        head = head.next;
        this.size--;
    }

    //对头结点的下一个结点进行判别
    Node cur = this.head;
    while(cur != null && cur.next != null){
        if(cur.next.t.equals(t)){
            this.size--;
            cur.next = cur.next.next;
        }
        else cur = cur.next;
    }

}

//找匹配某元素的个数
public void find(T t){
    Node cur = this.head;
    while(cur != null){
        if(cur.t.equals(t)){
            this.n++;
            cur = cur.next;
        }
        else cur = cur.next;
    }
    System.out.println("该元素在队列中个数为:" + this.n);
}

//删除链表第一个元素
public T removeFirst(){
    if(this.head == null){
        System.out.println("无元素可删除");
        return null;
    }
    Node delNode = this.head;
    this.head = this.head.next;
    delNode.next =null;
    this.size--;
    return delNode.t;
}

//删除链表的最后一个元素
public T removeLast(){
    if(this.head == null){
        System.out.println("无元素可删除");
        return null;
    }
    //只有一个元素
    if(this.getSize() == 1){
        return this.removeFirst();
    }
    Node cur = this.head;    //记录当前结点
    Node pre = this.head;    //记录要删除结点的前一个结点
    while(cur.next != null){
        pre = cur;
        cur = cur.next;
    }
    pre.next = cur.next;
    this.size--;
    return cur.t;
}

public String toString() {
    StringBuilder sb = new StringBuilder();
    Node cur = this.head;
    while(cur != null){
        sb.append(cur.t).append("->");
        cur = cur.next;
    }
    sb.append("NULL");
    return sb.toString();
}

public static void main(String[] args) {
    Linked linked = new Linked();
    for(int i = 0; i < 10; i++){
        linked.addFirst(i);
    }
    System.out.println("原始列表为:");
    System.out.println(linked);
    Linked.find(1);
    linked.addLast(10);
    System.out.println("在链表末尾插入10:");
    System.out.println(linked);
    linked.addFirst(10);
    System.out.println("在链表头结点插入10:");
    linked.add(10, 5);
    System.out.println(linked);
    System.out.println("在链表删除10:");
    linked.remove(10);
    System.out.println(linked);
    System.out.println("删除第一个元素:"+linked.removeFirst());
    System.out.println(linked);
    System.out.println("删除最后一个元素:"+linked.removeLast());
    System.out.println(linked);

}

}

调用find方法的地方呢,需要创建对象调用。
代码都贴出来吧,帮你调试一下

public class Linked<T> {
    private class Node{
        private T t;
        private Node next;
        public Node(T t,Node next){
            this.t = t;
            this.next = next;
        }
        public Node(T t){
            this(t,null);
        }
    }
    private Node head;            //头结点
    private int size;            //链表元素个数
    private int n;              //寻找元素个数
    //构造函数
    public Linked(){
        this.head = null;
        this.size = 0;
        this.n = 0;
    }

    //获取链表元素的个数
    public int getSize(){
        return this.size;
    }
    //判断链表是否为空
    public boolean isEmpty(){
        return this.size == 0;
    }
    //链表头部添加元素
    public void addFirst(T t){
        Node node = new Node(t);    //节点对象
        node.next = this.head;
        this.head = node;
        this.size++;
    }
    //向链表尾部插入元素
    public void addLast(T t){
        this.add(t, this.size);
    }
    //向链表中间插入元素
    public void add(T t,int index){
        if (index <0 || index >size){
            throw new IllegalArgumentException("index is error");
        }
        if (index == 0){
            this.addFirst(t);
            return;
        }
        Node preNode = this.head;
        //找到要插入节点的前一个节点
        for(int i = 0; i < index-1; i++){
            preNode = preNode.next;
        }
        Node node = new Node(t);
        //要插入的节点的下一个节点指向preNode节点的下一个节点
        node.next = preNode.next;
        //preNode的下一个节点指向要插入节点node
        preNode.next = node;
        this.size++;
    }

    //删除链表元素
    public void remove(T t){
        if(head == null){
            System.out.println("无元素可删除");
            return;
        }
        //要删除的元素与头结点的元素相同
        while(head != null && head.t.equals(t)){
            head = head.next;
            this.size--;
        }

        //对头结点的下一个结点进行判别
        Node cur = this.head;
        while(cur != null && cur.next != null){
            if(cur.next.t.equals(t)){
                this.size--;
                cur.next = cur.next.next;
            }
            else cur = cur.next;
        }

    }

    //找匹配某元素的个数
    public void find(T t){
        Node cur = this.head;
        while(cur != null){
            if(cur.t.equals(t)){
                this.n++;
                cur = cur.next;
            }
            else cur = cur.next;
        }
        System.out.println("该元素在队列中个数为:" + this.n);
    }

    //删除链表第一个元素
    public T removeFirst(){
        if(this.head == null){
            System.out.println("无元素可删除");
            return null;
        }
        Node delNode = this.head;
        this.head = this.head.next;
        delNode.next =null;
        this.size--;
        return delNode.t;
    }

    //删除链表的最后一个元素
    public T removeLast(){
        if(this.head == null){
            System.out.println("无元素可删除");
            return null;
        }
        //只有一个元素
        if(this.getSize() == 1){
            return this.removeFirst();
        }
        Node cur = this.head;    //记录当前结点
        Node pre = this.head;    //记录要删除结点的前一个结点
        while(cur.next != null){
            pre = cur;
            cur = cur.next;
        }
        pre.next = cur.next;
        this.size--;
        return cur.t;
    }

    public String toString() {
        StringBuilder sb = new StringBuilder();
        Node cur = this.head;
        while(cur != null){
            sb.append(cur.t).append("->");
            cur = cur.next;
        }
        sb.append("NULL");
        return sb.toString();
    }

    public static void main(String[] args) {
        Linked linked = new Linked();
        for(int i = 0; i < 10; i++){
            linked.addFirst(i);
        }
        System.out.println("原始列表为:");
        System.out.println(linked);
        linked.find(1);
        linked.addLast(10);
        System.out.println("在链表末尾插入10:");
        System.out.println(linked);
        linked.addFirst(10);
        System.out.println("在链表头结点插入10:");
        linked.add(10, 5);
        System.out.println(linked);
        System.out.println("在链表删除10:");
        linked.remove(10);
        System.out.println(linked);
        System.out.println("删除第一个元素:"+linked.removeFirst());
        System.out.println(linked);
        System.out.println("删除最后一个元素:"+linked.removeLast());
        System.out.println(linked);

    }
}

img

img

Java 实现双向链表_西凉的悲伤博客-CSDN博客 双向链表示意图:以下是双链表相对于单链表的优缺点。优点(1) 可以向前和向后遍历。(2) 如果给出指向要删除的节点的指针,双向链表中的删除操作会更有效率。(3)我们可以在给定节点之前快速插入一个新节点。在单向链表中,要删除一个节点,需要指向前一个节点的指针。为了获得这个前一个节点,有时会遍历列表。在双链表中,我们可以使用前一个指针获取前一个节点。缺点(1) 双链表的每个节点都需要额外的空间用于前一个指针。(2) 所有的操作都需要一个额外的指针来维护。例如,在插入时,我们需要同时修改前一个 https://blog.csdn.net/qq_33697094/article/details/121544972

你的查找的函数的实现里面有一步

if(cur.t.equals(t)){

对于 Node cur ,t是它的私有成员,不应该用cur.t来访问,你可以试试在Node的类里面加上getValue()方式是专门用来返回t的值

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632