【问题标题】:Linked List prepend and toString methods链表 prepend 和 toString 方法
【发布时间】:2021-02-07 15:43:33
【问题描述】:

我正在尝试输出列表,我在列表中添加了 3 个字符串并且它都输出 null。该代码似乎正确地添加和输出,但它只是不输出数据。我关注的方法是 prepend 和 toString。

`` 公共类 StringList {

/* ------------------------------------------------------- *
 * Inner classes                                           *
 * ------------------------------------------------------- */
/**
 * The node used by StringList.
 */
private class StrNode {

    String data;
    StrNode next;
}

/* ------------------------------------------------------- *
 * Instance variables                                      *
 * ------------------------------------------------------- */
private StrNode head;   // the head of the singly-linked list.

/* ------------------------------------------------------- *
 * Instance methods                                        *
 * ------------------------------------------------------- */
/**
 * No-argument constructor.
 */
public StringList() {
    head = null;
}

/**
 * Adds an item to the start of the list.
 *
 * @param s the item to add
 */
public void prepend(String s) {
    var newNode = new StrNode();
    // TODO: Adds an item to the start of the list.     
    if(head == null) {
        head = newNode;
    }
    else {
    newNode.next = head.next;
    head.next = newNode;
    }
    
}

/**
 * Adds an item to the end of the list.
 *
 * @param s the item to add
 */
public void append(String s) {
    // TODO:    Adds an item to the end of the list.
    
}

/**
 * Inserts an item after the first instance of a key if the key exists.
 *
 * @param s the item to insert
 * @param key the item in the list to insert after
 * @return whether the insertion was successful
 */
public boolean insertAfter(String s, String key) {
    // TODO:    Inserts an item after the first instance of a key if the key exists.
    
    return false;
}

/**
 * Deletes the first instance of an item from the list.
 *
 * @param key the value of the item to delete from the list.
 * @return whether the deletion was successful.
 */
public boolean delete(String key) {
    // TODO:    Deletes the first instance of an item from the list.
    
    return false;
}

/**
 * Returns the value of the nth item in the list.
 * 
 * @param n the zero-based index of the item to return
 * @return the value of the nth item
 */
public String get(int n) {
    // TODO:    Returns the value of the nth item in the list.
    // Note: if n is out of bounds, raise an IndexOutOfBoundsException.
    
    
    return null;
}

/**
 * Returns the number of items in the list.
 *
 * @return the number of items in the list
 */
public int length() {
    // TODO:    Returns the number of items in the list.
    int length = 0;
    StrNode current = head;
    
    while(current != null) {
        length++;
        current = current.next;
    }
    
    return length;
}

/**
 * Returns a string of all the items in the list separated by a space.
 *
 * The last item will have a space after it too.
 *
 * @return list of the list's values
 */
@Override
public String toString() {
    // TODO:    Returns a string of all the items in the list separated by a space.
    String result = "{";
    StrNode current = this.head;
    
    while(current != null) {
        result += current.data + " ";
        current = current.next;
    }
 
    return result + "}";

}

} ``

司机: ``

公共类主要{ /** * @param args 命令行参数 */ public static void main(String[] args) {

    StringList s = new StringList();
    
    s.prepend("one");
    s.prepend("two");
    s.prepend("three");
    System.out.println(s);      
    
}

}

``

【问题讨论】:

    标签: java methods linked-list


    【解决方案1】:

    错误在您的prepend(String s) 方法中。仔细看看 - 你从不使用s,也就是说,你传递给这个方法的字符串永远不会被存储。您只需添加newNode.data = s; 作为第二行。但是,还有第二个错误,因为 StrNode 对象未正确链接。

    解决方案

    public void prepend(String s) {
        var newNode = new StrNode();
        newNode.data = s;
        if (head == null) {
            head = newNode;
        } else {
            // First, we set the current head as the successor of the new newNode
            newNode.next = head;
            // Then, we set the new newNode as head (as we prepend)
            head = newNode;
        }
    }
    

    那么输出就是aspected:

    {three two one }
    

    附加评论

    您的toString() 方法将字符串与+ 连接在一个循环中。那是低效的,应该用StringBuilder 代替。 StringBuilder 还允许轻松删除“one”之后的最后一个空格:

    @Override
    public String toString() {
        StringBuilder result = new StringBuilder("{");
        StrNode current = this.head;
    
        while (current != null) {
            result.append(current.data).append(" ");
            current = current.next;
        }
        result.setLength(result.length() - 1);
    
        return result + "}";
    }
    

    【讨论】:

      猜你喜欢
      • 2017-07-29
      • 2013-04-11
      • 2015-05-02
      • 1970-01-01
      • 2014-05-09
      • 2016-07-21
      • 1970-01-01
      • 1970-01-01
      • 2016-06-05
      相关资源
      最近更新 更多