Замена двух соседних узлов в связанном списке java

У меня есть очень тривиальная проблема, что должно быть просто изменением ссылок. Я прочитал несколько ответов, и некоторые показывают, как это сделать, заменяя данные, а некоторые дают расплывчатое объяснение концепции.

Вот метод, который, кажется, запускает меня по кругу. Когда я заменяю целевой узел на предыдущий узел, этот узел просто пропускается. Затем, когда я возвращаюсь к ссылке на следующий узел, я застреваю в вечном цикле. Мне нужно знать, нужен ли мне еще один узел, проходящий от головы, или я могу просто сослаться на новую ссылку. Я знаю, что упускаю что-то совершенно очевидное.

for (cursor = head; cursor != null; cursor = cursor.link) {
  if (target == cursor.data) {
    Target = cursor.link.getLink();
    next = cursor.getLink();
    prev = cursor;
    System.out.println(prev.getData()); // for testing
    System.out.println(next.getData());
    prev.setLink(Target); // Swaps the first link
    //Target.setLink(prev); // causes eternal loop
  }}
  return Target.getData();
}

Это мой метод тестирования, создание списка из 7 узлов и вывод на экран.

public static void main(String[] args) {
  SLL LL = new SLL(18, null);

  LL.add(4);
  LL.add(14);
  LL.add(8);
  LL.add(12);
  LL.add(2);
  LL.add(28);
  System.out.println(LL.toString());
  System.out.println(LL.swap(12));
  System.out.println(LL.toString());
}

Это результат, который я получаю:

{18, 28, 2, 12, 8, 14, 4}

12

8

14

{18, 28, 2, 12, 14, 4}

Желаемый результат:

{18, 28, 2, 12, 8, 14, 4}

{18, 28, 2, 8, 12, 14, 4}


person Mattonio    schedule 12.07.2018    source источник
comment
Если возможно, опубликуйте код для классов SLL и Target. Я вижу, что вы используете cursor.link иногда и cursor.getLink() в другое время, так что непонятно конкретное поведение.   -  person lealceldeiro    schedule 12.07.2018
comment
Конструктор: public SLL(int initialData, SLL initialLink) { head = this; данные = исходные данные; ссылка = начальная ссылка; } Все ссылки должны быть .link, .getLink() я просто возился, когда он не работал. Все в одном классе   -  person Mattonio    schedule 13.07.2018


Ответы (1)


Похоже, вы пытаетесь поменять местами определенный узел (определяемый значением узла) с узлом после него?.

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

Что-то вроде этого должно работать, так как вы имеете дело с примитивами

if(currNode.value() == targetValue) {
   Node nextNode = currentNode.next();
   currentNode.setValue(nextNode.getValue()); //set the current node's value to the next node's value
   nextNode.setValue(targetValue);
}

Просто не забудьте обработать случай, когда ваше целевое значение находится в последнем узле в списке.

Изменить - поскольку по какой-то причине вы хотите вместо этого изменить ссылки, общая логика -

  • отслеживать 3 узла: предыдущий, текущий, следующий
  • установить предыдущую ссылку = следующую
  • установить текущую.ссылку = следующую.ссылку
  • установить next.link = текущий
person Orch    schedule 12.07.2018
comment
Да, я пытаюсь поменять местами узлы в зависимости от значения узла. Мой вопрос в том, как это сделать, изменив только ссылки, а не значения. - person Mattonio; 12.07.2018
comment
@Orch также требуется break; в операторе if, иначе целевое значение будет перемещено в конец списка - person Jorj; 12.07.2018
comment
@Mattonio, это вопрос домашнего задания? По какой причине вы не можете поменять местами значения? - person Orch; 12.07.2018
comment
@Orch, даже если это не вопрос домашнего задания, этот метод не очень хорош. Что делать, если узлы расширены, чтобы иметь более одного поля? Затем вам придется менять метод swap каждый раз, когда класс node изменяется или расширяется. - person mypetlion; 12.07.2018
comment
@mypetlion Мой ответ основан на заданном вопросе. Если вы измените вопрос, то, вероятно, изменится и ответ, это кажется очевидным. - person Orch; 12.07.2018
comment
Это упражнение из учебника по открытым структурам данных. Цель состоит в том, чтобы сравнить эффективность замены в односвязных и двусвязных списках. - person Mattonio; 13.07.2018
comment
Ну, это должно ответить на ваш вопрос. Прямо сейчас то, как вы устанавливаете ссылки, неверно. - person Orch; 13.07.2018