Альтернативное решение для Черепахи и Кролика, не совсем так приятно, поскольку я временно меняю список:
Идея состоит в том, чтобы ходить по списку и отменить его, когда вы идете. Затем, когда вы впервые достигнете узла, который уже был посещен, его следующий указатель будет указывать «назад», в результате чего итерация снова начнется к first
, где она завершается.
Node prev = null;
Node cur = first;
while (cur != null) {
Node next = cur.next;
cur.next = prev;
prev = cur;
cur = next;
}
boolean hasCycle = prev == first && first != null && first.next != null;
// reconstruct the list
cur = prev;
prev = null;
while (cur != null) {
Node next = cur.next;
cur.next = prev;
prev = cur;
cur = next;
}
return hasCycle;
Тестовый код :
static void assertSameOrder(Node[] nodes) {
for (int i = 0; i < nodes.length - 1; i++) {
assert nodes[i].next == nodes[i + 1];
}
}
public static void main(String[] args) {
Node[] nodes = new Node[100];
for (int i = 0; i < nodes.length; i++) {
nodes[i] = new Node();
}
for (int i = 0; i < nodes.length - 1; i++) {
nodes[i].next = nodes[i + 1];
}
Node first = nodes[0];
Node max = nodes[nodes.length - 1];
max.next = null;
assert !hasCycle(first);
assertSameOrder(nodes);
max.next = first;
assert hasCycle(first);
assertSameOrder(nodes);
max.next = max;
assert hasCycle(first);
assertSameOrder(nodes);
max.next = nodes[50];
assert hasCycle(first);
assertSameOrder(nodes);
}
Один из способов, которым вы могли бы соединить эти 2 таблицы и отобразить все данные в них с помощью JOIN
, выглядит следующим образом:
SELECT table1.*, table2.* FROM data_skm_organisasi AS table1
LEFT JOIN data_skm_kejuaraan AS table2 ON table1.namaKegiatan = table2.namaKegiatan AND table1.namaMahasiswa AND table2.namaMahasiswa
ORDER BY table1.id ASC
Это вернет все данные в этих 2 таблицах, которые имеют одинаковые значения для namaMahasiswa
и namaKegiatan
.
Обратите внимание: если вы используете table1.*
и table2.*
, вы не сможете получить доступ ко всем данным, так как столбцы будут иметь одно и то же имя, поэтому это ] рекомендовано всегда указывать все поля, которые необходимо вернуть, и использовать aliases
для полей с одинаковыми именами в обеих таблицах.
Пр. SELECT table1.tingkatan, table2.tingkata AS tingkata2 ....
Но вам действительно следует подумать о добавлении какого-либо условия WHERE
к вашему запросу, чтобы не тратить много времени на загрузку данных, если у вас слишком много записей.
П.С. Это моя лучшая оценка структуры вашей таблицы, так как у вас нет правильной настройки отношений для этих таблиц