Каким должно быть имя аргумента prev_node, переданного в метод, указанный ниже? - PullRequest
0 голосов
/ 14 июля 2020
public class linkedList {
  Node head;

   class Node {
    int data;
    Node next;
    Node(int d){
      data  = d;
    }
  }    
    public void insertAfter(Node prev_node, int new_data){
    if (prev_node == null){
      System.out.print("The given previous node cannot be null");
      return;
    }
    Node new_node = new Node(new_data);
    new_node.next = prev_node.next;
    prev_node.next = new_node;
  }
}

Для данного связанного списка: 11,73,80,41,22, если я хочу вставить число (например, 0) после 73, я могу передать его как insertAfter(llist.head.next,0).

Но это насколько я могу дойти до названия prev_node . Что входит в качестве аргумента, если я хочу ввести 0 после третьей, четвертой ... et c позиции. В чем же тогда будет аргумент?

PS: Простите меня, если заголовок вводит в заблуждение или сбивает с толку, я не смог сформулировать запрос правильными словами для заголовка.

Ответы [ 2 ]

0 голосов
/ 14 июля 2020

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

public Node getNodeAtPosition(Node head, int position){
    if (head == null || position < 0) 
        throw new IllegalArgumentException("head == null or position < 0");
    Node helper = head;
    while (position != 0) {
        if (helper == null) 
            throw new IllegalArgumentException("position > length of list");
        helper = helper.next;
        position--;
    }
    return helper;
}
0 голосов
/ 14 июля 2020

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

Insert after 11 -> insertAfter(llist.head, 0)
Insert after 73 -> insertAfter(llist.head.next, 0)
Insert after 80 -> insertAfter(llist.head.next.next, 0)
Insert after 41 -> insertAfter(llist.head.next.next.next, 0)
Insert after 22 -> insertAfter(llist.head.next.next.next.next, 0)

Но это неправильный подход. Вам необходимо предоставить механизмы обхода, а также другие методы, которые могут добавлять значение в начале, в конце списка, в заданную позицию et c.

...