0

I am trying to output the list, I have prepended 3 strings to the list and it all outputs null. The code seems to prepend and output correctly, however it just doesn't output the data. The methods I am focusing on are prepend and toString.

`` public class 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 + "}"; } 

} ``

Driver: ``

public class Main { /** * @param args the command line arguments */ public static void main(String[] args) {

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

}

``

1 Answer 1

1

The error is in your prepend(String s) method. Have a close look -you never use s, i.e., the string which you pass to this method is never stored. You simply have to add newNode.data = s; as the second line. However, there is also a second error as the StrNode objects are not linked correctly.

Solution

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; } } 

Then the output is as aspected:

{three two one } 

Additional Comment

Your toString() method concats strings in a loop with +. That is inefficient and should be replaced by a StringBuilder. The StringBuilder also allows easily to delete the last space after "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 + "}"; } 
Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.