Как удалить узел из связанного списка - PullRequest
0 голосов
/ 07 октября 2011

Эй, ребята, я написал этот метод deleteNode (), который работает, если я использовал числа (int), но не, когда я пытаюсь передать строку. Я распечатываю список имен String [], и я пытаясь удалить определенное имя из списка. Когда я ввожу имя, оно печатает «Узел не найден». Как я уже сказал, если я распечатываю список чисел, он отлично работает, но если я изменяю и печатаю строку, это не так. Любая помощь приветствуется.

   public class BigNode {


   public String dataitems; 
    public BigNode next; 
    BigNode front ;

    public void initList(){
        front = null;
    }

    public BigNode makeNode(String number){
        BigNode newNode;
        newNode = new BigNode();
        newNode.dataitems = number;
        newNode.next = null;
        return newNode;
    }

    public boolean isListEmpty(BigNode front){
        boolean balance;
        if (front == null){
            balance = true;
        }
        else {
            balance = false;
        }
        return balance;

    }

    public BigNode findTail(BigNode front) {
        BigNode current;
        current = front;
        while(current.next != null){
            //System.out.print(current.dataitems);
            current = current.next;

        } //System.out.println(current.dataitems);
        return current;
    }

    public void addNode(BigNode front ,String number){
        BigNode tail;
        if(isListEmpty(front)){
            this.front = makeNode(number);
        } 
        else {
            tail = findTail(front);
            tail.next = makeNode(number);
        }
    }
    public void deleteNode(BigNode front, String value) {
        BigNode curr, previous = null; boolean found; 

            if (!isListEmpty(front)){
                curr = front;
                found = false;

                while ((curr.next != null) && (!found)) {
                    if(curr.dataitems.equals(value)) {
                        found = true;
                    } 
                    else {
                        previous = curr;
                        curr = curr.next;
                    }
                }
                if (!found) {
                    if(curr.dataitems.equals(value)) {
                        found = true;
                    }
                }
                if (found) {
                    if (curr.dataitems.equals(front.dataitems)){ // front.dataitems may be wrong .dataitems 
                        front = curr.next;
                    } else { 

                        previous.next = curr.next;
                    }
                } else {
                    System.out.println("Node not found!");
                    //curr.next = null; // Not sure If this is needed
                }
        } 
            showList(front);
    }




    public void printNodes(String[] len){


        int j;
        for (j = 0; j < len.length; j++){

            addNode(front, len[j]);
        }  showList(front);
    }

    public void showList(BigNode front){
        BigNode current;
        current = front;
        while ( current.next != null){
            System.out.print(current.dataitems + ", ");
            current = current.next;
        }
        System.out.println(current.dataitems);
    }
    public static void main(String[] args) {
                   String[] names = {"Billy Joe", "Sally Mae", "Joe Blow", "Tasha Blue"}; 

        BigNode x = new BigNode(); 
                   x.printNodes(names); 
                   Scanner in = new Scanner(System.in);
                   String delete = in.next();
                  x.deleteNode(x.front, delete); 
          }

String [] names = {name1, name2, name3, name4}

- Сначала распечатывает список, затем спрашивает, какое имя удалить.

Ответы [ 4 ]

3 голосов
/ 07 октября 2011

РЕДАКТИРОВАТЬ: Хорошо, я выяснил, что не так с примером кода, который вы отправили.

Вы звоните Scanner.next(), который читает одно слово .Все значения вашего узла два слова .Так что, если я наберу «Sally Mae», то на самом деле просто ищет «Sally».

Это не имеет никакого отношения к большей части кода в BigNode (хотя это, безусловно, можетбыть более элегантным).В основном это:

String delete = in.next();

должно быть

String delete = in.nextLine();

Теперь я бы настоятельно предложил бы вам не просто изменить код,но вместо этого подумайте о способах, которыми вы могли бы диагностировать это для себя:

  • Добавьте запись в ваш код, чтобы показать искомое значение, и каждое значение при его тестировании
  • Использованиеотладчик для пошагового выполнения кода, отслеживания переменных
  • Используйте модульные тесты для тестирования кода - они не показали бы вам проблему (как это было не в коде, для которого вы обычно пишете тесты), ноони бы дали вам большую уверенность в том, что проблема не была в тестируемом коде.

Если вы попробуете некоторые или предпочтительно все из этих подходов,Вы узнаете намного больше из этого вопроса, чем просто как использовать Scanner ...


В разных местах вы сравниваете строку ссылки , используя== оператор.Он найдет ваш узел, только если вы передадите ссылку на один из существующих строковых объектов в списке, а не ссылку на равно строковый объект.

Вы хотите что-то вроде:

if (curr.dataitems.equals(value))

(но с тщательной проверкой null).

2 голосов
/ 07 октября 2011

Вы должны использовать сравнение String.equals вместо == сравнения.

if(curr.dataitems == value) {

должно быть:

if(curr.dataitems.equals(value) {
1 голос
/ 07 октября 2011

Вы делаете сравнения с ==. Для int это сравнивает значения, но для String только ссылки. Так что вы хотите удалить строку с тем же значением, но в разных объектах это не удастся.

Вместо этого используйте String.equals().

0 голосов
/ 07 октября 2011

Вы всегда должны использовать equals () для сравнения значений объекта, а не ==. Например, в вашем коде эта строка:

curr.dataitems == value

должно быть записано как:

curr.dataitems.equals(value)
...