简体   繁体   中英

remove() method of a linked list

I am taking a programming class I have the following assignment.

Write a menu driven program that either accepts words and their meanings, or displays the list of words in lexicographical order (ie as in a dictionary). When an entry is to be added to the dictionary you must first enter the word as one string, and then enter the meaning as separate string. Another requirement - from time to time words become obsolete. When this happens, such word must be removed from the dictionary.

Use the JOptionPane class to enter the information.

Use the concept of linked list to carryout this exercise. You will need at minimum the following classes:

  • A WordMeaning class that hold the name of a word and its meaning.
  • A WordMeaningNode class that creates the node of information and its link field.
  • A WordList class that creates and maintain a linked list of words and their meanings.
  • A Dictionary class that test your classes.

For the output, the program should produce two scrollable lists:

  • The current list of words and their meanings.
  • The list of the deleted words. You need not list the meanings, just the words.

So far, I have everything coded except for the remove method, and I am not sure how to code that, so could anyone help me please. I coded the add method already, but now I don't know where to begin with the remove method in my WordList class. My classes are below.

WordList Class:

public class WordList {

WordMeaningNode list;

WordList() {
    list = null;
}

void add(WordMeaning w)// In alphabetical order
{
    WordMeaningNode temp = new WordMeaningNode(w);

    if (list == null)
        list = temp;
    else
    {
        WordMeaningNode aux = list;
        WordMeaningNode back = null;
        boolean found = false;

        while(aux != null && !found)
            if( temp.getWordMeaning().getName().compareTo(aux.getWordMeaning().getName()) < 0 )
                found = true;
            else
            {
                back = aux;
                aux = aux.next;
            }

        temp.next = aux;
        if (back == null)
            list = temp;
        else
            back.next = temp;
    }
}

boolean listIsEmpty() {
    boolean empty;
    if (list == null) {
        empty = true;
    } else {
        empty = false;
    }

    return empty;
}

public String toString()
{
    String result = "";
    int count = 0;
    WordMeaningNode current = list;

    while (current != null)
    {
        count++;
        result += current.getWordMeaning().getName() + "\n" + "\t" + current.getWordMeaning().getDefinition();
        current = current.next;
    }

    return result + "\nThe number of words is : " + count;
}
}

I tried to use the same method format for the remove method as I did for the add method, but didn't really work, or I did it wrong.

To remove an item from LinkedList, you should iterate over its nodes. Then, if occurence found, connect previous and next node, setting previous.next = next :

boolean remove(String word) {

    if (list == null)   // list is empty
        return false;

    WordMeaningNode n = list;
    WordMeaningNode prev = null;

    do {
       if (n.wordMeaning.name.equals(word)) {  // word found
           if (prev != null) {
              prev.next = n.next;   // connect previous to next
           } else {
              list = list.next;     // connect head to next
           }
           return true;
       }
       prev = n;
       n = n.next;
    } while (n != null);   // repeat till the end of a list
    return false;
}

In main code, change the piece of case 2 :

if (diction.remove(word)) {
    obsolete.add(new WordMeaning(word, " "));
    // notify about deletion
} else {
    // notify that word don't exist.
}

because you really don't need NullPointerException here.

To remove an element from your list, you need to find the element just before the one to remove, and set its next reference to the element after the one to remove.

You will have some (not mutually exclusive) corner cases to pay attention to :

  • If the element to remove is the first (then, the first node of WordList should be set to the element after the one to remove)
  • If the element to remove if the last one in the list (then you will have to set the previous element's next reference to null )

Also, I see you need to keep a list of removed items, so don't forget to keep a reference on the removed item during the process, and to add it to your list of obsolete words.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM