Java链接列表 - 添加方法

dys*_*nia 4 java linked-list

数据结构类,实现具有头,尾和当前节点的单链表.如果遇到方法问题,可以在正确的方向上使用微调.

从赋值,编写方法:

add(item):在列表中的当前节点之后添加item(String),并设置当前指针以引用新节点.

我的尝试:

public void add(String item)
{
    if(curr != null)
    {
        Node newNode = new Node(item, curr.next);
        curr.next = newNode;
        curr = newNode;
    }
    else
    {
        head = tail = new Node(item, null);
        curr = head;
    }
}
Run Code Online (Sandbox Code Playgroud)

我的添加方法似乎只在我将项目添加到列表中间时才起作用,而不是在任何一端.如果我使用它来添加一些项目然后打印列表,只有我添加的第一个项目将在列表中,而我的prepend和append方法测试得很好.

我的代码有什么明显的问题吗?我觉得我错过了一些明显的东西.

所有:

public class LinkedList {
    Node head = null; /* Head of the list */
    Node tail = null; /* Tail of the list */
    Node curr = null; /* Current node in the list */

    public void prepend(String item) {
        if (head == null) {
            head = tail = new Node(item, null);
            curr = head;
        } else {
            head = new Node(item, head);
            curr = head;
        }
    }

    public void append(String item) {
        if (head == null) {
            head = tail = new Node(item, null);
            curr = tail;
        } else {
            tail.next = new Node(item, null);
            tail = tail.next;
            curr = tail;
        }
    }

    public void add(String item) {
        if (curr != null) {
            Node newNode = new Node(item, curr.next);
            curr.next = newNode;
            curr = newNode;
        } else {
            head = tail = new Node(item, null);
            curr = head;
        }
    }

    public void delete() {
        if (curr.next == null) {
            Node temp = head;
            while (temp.next != curr) {
                System.out.println(temp.item);
                temp = temp.next;
            }
            temp.next = null;
            curr = head;
        }
    }

    public void find(String item) {
        Node temp = new Node(curr.item, curr.next);
        if (item.equals(temp.item))
            curr = temp;
        else {
            temp = temp.next;
            while (temp.next != null && temp != curr) {
                if (item.equals(temp.item))
                    curr = temp;
            }
        }
    }

    public String get() {
        if (curr != null)
            return curr.item;
        else
            return "";
    }

    public boolean next() {
        if (curr != tail) {
            curr = curr.next;
            return true;
        } else
            return false;
    }

    public void start() {
        curr = head;
    }

    public void end() {
        curr = tail;
    }

    public boolean empty() {
        if (head == null)
            return true;
        else
            return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

Node 类:

class Node {
    Node next;
    String item;

    Node(String item, Node next) {
        this.next = next;
        this.item = item;
    }
}
Run Code Online (Sandbox Code Playgroud)

Way*_*ett 5

确实存在一个问题add:tail当节点已经存在时它不会更新.考虑这一系列动作:

LinkedList list = new LinkedList(); 
list.add("one");
list.add("two");
list.append("three");
Run Code Online (Sandbox Code Playgroud)

如果你要使用这个打印它:

public void print() {
    Node curr = this.head;
    while(curr != null) {
        System.out.println(curr.item);
        curr = curr.next;
    }
}
Run Code Online (Sandbox Code Playgroud)

像这样:

list.print();
Run Code Online (Sandbox Code Playgroud)

你会得到以下输出:

one
three
Run Code Online (Sandbox Code Playgroud)

发生这种情况是因为tail- append依赖于 - 继续指向执行Node第二个add操作后的第一个.


Bhe*_*ung 0

我认为问题是

if (curr != null) {
    Node newNode = new Node(item, curr.next); //<-- here (curr.next)

//and

Node(String item, Node next) {
    this.next = next; //<-- here
Run Code Online (Sandbox Code Playgroud)

尝试(已编辑):

Node newNode = new Node(item, curr); // pass curr to the constructor of Node
curr = newNode;
Run Code Online (Sandbox Code Playgroud)