Node getParent() {
while (parent != this) {
parent = parent.getParent();
}
return parent;
}
Проблемы:
- Вы изменяете поле
parent
. - Вы должны проверять, является ли родитель родителя сам ... не этим.
Ваш код, вероятно, должен быть:
Node getParent() {
Node p = parent;
while(p.parent != p) {
p = p.parent;
}
return p;
}
Или рекурсивно:
Node getParent() {
return (parent == this) ? this : parent.getParent();
}
(В этом случае итеративная версия более безопасна. Вы не должны получать «бесконечную» рекурсию, но все еще существует риск того, что вы можете повторить слишком глубоко, с патологически глубокой структурой данных.)
ОБНОВЛЕНИЕ - очевидно, вы намерены, чтобы getParent
(постепенно) разрушал родительскую цепочку каждого Node
его посещения.В этом случае рекурсивное решение будет выглядеть следующим образом:
Node getParentAndCollapse() {
if (parent == this) {
return this;
} else {
parent = parent.getParentAndCollapse();
return parent;
}
}
Итеративное решение, которое разрушает всю цепочку, требует двух обходов цепочки:
- Обойти цепочку и найти конечного родителя.
- Снова пройдитесь по цепочке, обновив все поля
parent
для ссылки на конечного родителя. - Верните конечного родителя.
Примерно так
Node getParentAndCollapse() {
Node p = getParent(); // iterative version
Node n = this;
while (n.parent != p) {
Node np = n.parent;
n.parent = p;
n = np;
}
return p;
}