如何使用 java 中的节点编写 toString 方法

How to write a toString method using nodes in java

所以,我不太确定我的 toString 方法有什么问题。当我 运行 我的测试表明它不正确时,我一直有错误。

基本上我正在做的是实现一个循环的 DoublyLinkedList 数据结构。与单向链表一样,双向链表中的节点具有对下一个节点的引用,但与单向链表不同的是,双向链表中的节点也具有对前一个节点的引用。此外,因为列表是"cyclic",所以列表中最后一个节点中的"next"引用指向列表中的第一个节点,而列表中第一个节点中的"prev"引用指向列表中的最后一个节点。

这是我的代码:

public class DoublyLinkedList<E>
{
private Node first;
private int size;

@SuppressWarnings("unchecked")
public void add(E value)
{
    if (first == null)
    {
        first = new Node(value, null, null);
        first.next = first;
        first.prev = first;
    }
    else
        {
        first.prev.next = new Node(value, first, first.prev);
        first.prev = first.prev.next;
    }
    size++;
}
private class Node<E>
{
    private E data;
    private Node next;
    private Node prev;

    public Node(E data, Node next, Node prev)
    {
        this.data = data;
        this.next = next;
        this.prev = prev;
    }
}
@SuppressWarnings("unchecked")
public void add(int index, E value)
{
    if (first.data == null)
    {
        throw new IndexOutOfBoundsException();
    } else if (index == 0)
    {
        first = new Node(value, first.next, first.prev);
    }
    else
        {
        Node current = first;
        for (int i = 0; i < index - 1; i++)
        {
            current = current.next;
        }
        current.next = new Node(value, current.next, current.prev);
    }
}
@SuppressWarnings("unchecked")
public void remove(int index)
{
    if (first.data == null)
    {
        throw new IndexOutOfBoundsException();
    }
    else if (index == 0)
    {
        first = first.next;
    }
    else
        {
            Node current = first.next;
            for (int i = 0; i < index - 1; i++)
        {
            current = current.next;
        }--size;
            current.next = current.next.next;

    }
}
public E get(int index)
{
 if(index < 0)
    {
        throw new IndexOutOfBoundsException();
    }
    if(index > size)
    {
        throw new IndexOutOfBoundsException();
    }
    Node current = first;
    for (int i = 0; i < index; i++)
    {
        current = current.next;
    }
    return (E) current.data;
}
@SuppressWarnings("unchecked")
public int indexOf(E value)
{
    int index = 0;
    Node current = first;
    while (current != current.next)
    {
        if (current.data.equals(value))
        {
            return index;
        }
        index++;
        current = current.next;
    }
    return index;
}
public boolean isEmpty()
{
    if (size == 0)
    {
        return true;
    }
    else
        {
        return false;
    }
}
public int size()
{
    return size;
}

这是我的 toString() 方法,当我 运行 我的测试时,它显然表明它不正确,但我不知道它有什么问题。

它应该做的是 return 列表的字符串表示,以“[”开头,后跟由逗号和 space 分隔的每个元素,并以“]”结尾.最后一个元素后面没有逗号和 space。一个空列表生成一个没有 space 的字符串,只有“[]”。此实现应与 ArrayList 中的实现匹配。

@SuppressWarnings("unchecked")
public String toString()
{
    if (first.data == null)
    {
        return "[]";
    }
    else
        {

        Node current = first;
            String result = "[" + current.data;
        while (current.next != null)
        {
            result += current.data + ", ";
            current = current.next;
        }
        result += "]";
        return result;
    }
}
}

我知道我的 removeMethod() 不准确。我针对这些提出了单独的问题,如果你愿意帮助我解决这些问题,我将不胜感激。

我对你的 add() 方法和 toString() 方法做了一些改动:

public void add(E value) {
    if (first == null) {
        first = new Node(value, null, null);
    } else {
        Node current = first;
        while (current.next != null) {
            current = current.next;
        }
        current.next = new Node(value, null, current);
    }
    size++;
}
public String toString()
{
    if (first == null)
    {
        return "[]";
    }
    else
    {
        String result = "[" + first.data;
        Node current = first.next;
        while (current != null)
        {
            result += ", " +current.data ;
            current = current.next;
        }
        result += "]";
        return result;
    }
}

这里主要测试一下:

public static void main(String[] args) {
    DoublyLinkedList<Integer> list = new DoublyLinkedList<>();
    list.add(1);
    list.add(2);
    list.add(3);
    System.out.println(list.toString()); // [1, 2, 3]
}

我在上面的代码中犯了一些小错误,所以我想通了,我要post我的答案。

@SuppressWarnings("unchecked")
public String toString()
{
    if (isEmpty())
    {
        return "[]";
    }
    else
        {
            String result = "[" + first.data;
            Node current = first.next;
        for(int i = 0; i < size-1; i++)
        {
            result += ", " + current.data;
            current = current.next;
        }
        result += "]";
        return result;
    }
}