Я согласен с @Stephen в том, что я не даю ответ (полностью), но я думаю, что я должен дать вам подсказки.
Важно понимать, что в Java явно не указываются указатели - скорее, когда они не примитивны (например, не char
, byte
, int
, double
, float
, long
, boolean
, short
) передается функции, она передается как ссылка. Таким образом, вы можете использовать временные переменные для обмена значениями. Попробуйте написать код самостоятельно или посмотрите ниже:
public static void swapNodeNexts(final Node n1, final Node n2) {
final Node n1Next = n1.next;
final Node n2Next = n2.next;
n2.next = n1Next;
n1.next = n2Next;
}
Тогда вам понадобится структура данных для хранения Node
s. Важно, чтобы было только четное число Node
с (нечетные числа излишне усложняли вещи). Также необходимо инициализировать узлы. Вы должны поместить это в свой основной метод.
public static final int NUMPAIRS = 3;
public static void main(final String[] args) {
final Node[] nodeList = new Node[NUMPAIRS * 2];
for (int i = 0; i < nodeList.length; i++) {
nodeList[i] = new Node();
nodeList[i].n = (i + 1) * 10;
// 10 20 30 40
}
// ...
}
Важной частью является установка следующих значений узла. Вы не можете просто пройти цикл с for
для всех из них, потому что тогда последний из них next
будет выбрасывать IndexOutOfBoundsException
. Попробуйте сделать его самостоятельно или загляните в мой.
for (int i = 0; i < nodeList.length - 1; i++) {
nodeList[i].next = nodeList[i + 1];
}
nodeList[nodeList.length - 1].next = nodeList[0];
Затем запустите на них свою функцию подкачки с помощью цикла for
. Но помните, что вы не хотите запускать его на каждом узле ... подумайте немного.
Если вы не можете понять это, вот мой окончательный код:
// Node
class Node {
public int n; // value
public Node next; // pointer to next node
@Override
public String toString() {
return "Node [n=" + n + ", nextValue=" + next.n + "]";
}
}
// NodeMain
public class NodeMain {
public static final int NUMPAIRS = 3;
public static void main(final String[] args) {
final Node[] nodeList = new Node[NUMPAIRS * 2];
for (int i = 0; i < nodeList.length; i++) {
nodeList[i] = new Node();
nodeList[i].n = (i + 1) * 10;
// 10 20 30 40
}
for (int i = 0; i < nodeList.length - 1; i++) {
nodeList[i].next = nodeList[i + 1];
}
nodeList[nodeList.length - 1].next = nodeList[0];
// This makes 1 -> 2 -> 3 -> 4 -> 1 etc.
printNodes(nodeList);
for (int i = 0; i < nodeList.length; i += 2) {
swapNodeNexts(nodeList[i], nodeList[i + 1]);
}
// Now: 2 -> 1 -> 4 -> 3 -> 1 etc.
printNodes(nodeList);
}
private static void printNodes(final Node[] nodeList) {
for (int i = 0; i < nodeList.length; i++) {
System.out.println("Node " + (i + 1) + ": " + nodeList[i].n
+ "; next: " + nodeList[i].next.n);
}
System.out.println();
}
private static void swapNodeNexts(final Node n1, final Node n2) {
final Node n1Next = n1.next;
final Node n2Next = n2.next;
n2.next = n1Next;
n1.next = n2Next;
}
}
Я надеюсь, что вы смогли понять хотя бы кое-что из этого под руководством. Что еще более важно, однако, важно, чтобы вы поняли концепции здесь. Если у вас есть какие-либо вопросы, просто оставьте комментарий.