2015-10-28 4 views
0

Итак, мне нужно удалить элементы из кругового списка, как часть более крупной программы, которая не работает, и я не могу удалить последний узел, переданный в метод удаления , если проиндексированный индекс равен 1, он удалит 1-й узел в списке и заменит его, но когда останется только один узел, ему нечего ссылаться, было в это время. я оставлю мой метод удаления здесьJava Circular Linked List, Remove Node не работает должным образом

public void delete(int index) 
{ 
    if(Node.numOfUsers == 1) 
    { 
     first=null; 
     return; 
    } 

    //make curr the same as first node 
    int i = 1; 
    curr=first; 
    //if index passed in is 1, make temporary node same as one after first node 
// if(size<1) 
    // { 

     // System.out.println("ok so this is where we are at"); 
    // } 
    if(index==1) 
    { 
     temp=first.nextNode; 

     while(temp.nextNode!=first) 
     { 
      temp=temp.nextNode; 
     } 

     temp.nextNode=temp.nextNode.nextNode; 
     first=curr.nextNode; 
    } 
    else 
    { 
     //as long as i is not equal to node index-1 move current on 1 and increment i by 1 
     while(i != index-1) 
     { 
      curr=curr.nextNode; 
      i++; 
     } 
     //curr.nextNode is pointing to the node index we want and making it equal to one index above it 
     curr.nextNode=curr.nextNode.nextNode; 
    } 
    Node.numOfUsers--; 
    int size=size(); 


} 

}

+1

Вы должны рассматривать его как особый случай. Если список пуст, установите флаг или введите нулевой указатель вместо указания на элемент списка. Вам действительно повезло, с круговым связанным списком есть только один специальный случай, с некруглыми связанными списками у вас более одного (операции с первым и последним элементом). – Michael

ответ

1

Похоже, вы отслеживание по всему миру из числа пользователей. Если это будет вести себя так, как я думаю, вы могли бы просто провести небольшую проверку в начале этого метода, чтобы, если она равна нулю, вы не выполняете ни одну из следующих ей логик.

if(Node.numOfUsers == 0) return; 

Это сделает так, чтобы вы не потрудились выполнять какую-либо другую логику.

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

public void delete(Node n) { 
    if(Node.numOfUsers == 0 || n == null) return; // 0 nodes or null parameter. 

    Node temp = first; 

    if(temp.next == null) { //only one node 
     temp = null; //simply delete it 
    } else { 
     while(temp.next != n) { 
      temp = temp.next; 
      if(temp == first) { //if we circle the entire list and don't find n, it doesn't exist. 
       return; 
      } 
     } 
     temp.next = n.next; // perform the switch, deleting n 
    } 
} 

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

Логика сравнения значений будет идентична приведенной выше, однако вместо сравнения if(temp == n) вы бы сравнили if(temp.data.equals(n.data)). Использование метода .equals() специально предназначено для типа String, но вы можете изменить его для работы с любым типом данных, который вы ожидаете, или еще лучше написать настраиваемый метод .equals, который позволяет использовать Generics для вашего абстрактного типа данных.

+0

Это имеет смысл для меня, но как передать узел в метод? Список ссылок LinkedList = новый LinkedList(); \t \t list.add ("mick o gorman"); \t \t list.add ("cathal moore"); \t \t list.add ("ciaran keyes"); \t \t list.add ("vinny crowley"); \t \t list.size(); \t \t list.delete (1); \t \t list.size(); \t \t list.delete (1); \t \t list.size(); \t \t list.delete (1); \t \t list.size(); \t \t list.delete (1); \t \t \t \t список.размер(); Я проходил индексы, но что бы я поставил в скобки, если узлы не все названы –

+0

Я предположил, что у вас будет доступ к узлу, который вы хотите передать. Если это неверно, использование индексов будет по-прежнему работать, но я считаю эту методологию более чистой. Например, если у вас есть Node n = новый узел («ABC»); и вы разместили этот узел в своей структуре данных, вы можете удалить его, пока у вас есть ссылка на n. Если это не так в вашей программе, не стесняйтесь использовать индексы (или, возможно, сравнивать значения, которые содержит узел) – James

+0

@ MickO'Gorman См. Мой обновленный ответ и принимайте, если это решает вашу проблему. – James