У меня есть метод для замены двух узлов в круговом связанном списке
Принимает 2 объекта в качестве аргументов. Код работает для случаев, когда
любой объект имеет элемент головы
public void exchange(E a, E b) {
Node<E> head = tail.getNext();
if(a == b)
return;
if(isEmpty() || size == 1) //no exchange if size is 1
return;
if(size == 2){ //if size is two, head will be tail and tail will be head
rotate();
}
else{
Node<E> currA = head, prevA = null; //search for first node
if(head.getElement() == a){
Node<E> temp = head;
while(!temp.getNext().equals(head)){
temp = temp.getNext();
}
prevA = temp;
}else if(tail.getElement() == a){
currA = tail;
while(!currA.getNext().equals(tail)){
prevA = currA.getNext();
}
}else{
while(!currA.getElement().equals(a)){
prevA = currA;
currA = currA.getNext();
if(currA.getNext() == head)
break;
}
}
Node<E> currB = head, prevB = null; //Search for second node
if(currB.getElement() == b){
Node<E> temp = head;
while(!temp.getNext().equals(head)){
temp = temp.getNext();
}
prevB = temp;
}else if(tail.getElement() == b){
currB = tail;
while(!currB.getNext().equals(tail)){
prevB = currB.getNext();
}
}else{
while(!currB.getElement().equals(b)){
prevB = currB;
currB = currB.getNext();
if(currB.getNext() == head)
break;
}
}
System.out.println(currA.getElement() +" currentA"); //I get output for this
System.out.println(currB.getElement() +" currentB");
System.out.println(prevA.getElement() +" previousA");// Gives null pointer exception when object a is head
System.out.println(prevB.getElement() +" previousB");// Gives null pointer exception when object b is head
prevA.setNext(currB);
prevB.setNext(currA);
Node<E> temp = currA.getNext();
currA.setNext(currB.getNext());
currB.setNext(temp);
}
}
Мой код может давать и использовать currA (и currB)
Но
Если значение a совпадает со значением head, вместо назначения prevA в операторе if оно указывается как нулевой указатель. То же самое происходит, если b является элементом head, а prevB равен нулю. (Код останавливается на этом)