2010-12-29 7 views
2

У меня есть вектор в векторе в вектор ..... Но я не знаю, сколько из них (какая глубина). Как изменить содержимое последнего вектора?Вектор в вектор ... Java

ответ

5

Вы собираетесь использовать ... дождаться его ... РЕЗЕРВИРОВАНИЕ!

Вот пример связанного списка

public Node<E> go_deep(Node<E> nodeRef) { 
    // base case 
    if(nodeRef.next == NULL) 
    return nodeRef; 

    return go_deep(nodeRef.next); 
} 

Тогда вы можете получить «последний» узел по:

public static void main(String[] args) { 
    Node<E> lastNode = go_deep(head); 
} 

Где голова ваш первый элемент (вектор в данном случае). У вас могут быть разные методы для следующих и предыдущих ...

Я пишу это с головы до головы, и вам нужно определить узел, если вы действительно хотите, чтобы это работало, его просто основная идея. ..

Если Vector (Node в моем примере) не передается по ссылке:

// if you have two-way references 
public static void main(String[] args) { 
    Node<E> lastNode = go_deep(head); //returns the last Node 
    Node<E> prevNode = lastNode.prev; //returns the Node before 
    Node<E> newNode = new Node<E>();  

    // update newNode with lastNode's values 
    newNode.foo = lastNode.foo; 
    newNode.bar = lastNode.bar + 7; 

    prevNode.next = newNode; //newNode is inserted into the structure - lastNode dies :(
} 

Если у вас есть один конец ссылки, мы изменяем go_deep возвращать массив узла и его родителей:

public Node<E>[] go_deep(Node<E> nodeRef) { 
    // base case 
    // THERE ARE EDGE CASES THAT I'M IGNORING BECAUSE I'M NOT PROGRAMMING FOR YOU! 
    if(nodeRef.next.next == NULL) { 
    Node<E>[] arr = new Node<E>[2]; 
    arr[0] = nodeRef; // the "prev" node 
    arr[1] = nodeRef.next; // the "last" node 
    return arr; 
    } 

    return go_deep(nodeRef.next); 
} 

затем в основной:

public static void main(String[] args) { 
    Node<E>[] nodes = go_deep(head); //returns the array of nodes 
    Node<E> lastNode = nodes[1]; // returns the last Node 
    Node<E> prevNode = nodes[0]; //returns the Node before 
    Node<E> newNode = new Node<E>();  

    // update newNode with lastNode's values 
    newNode.foo = lastNode.foo; 
    newNode.bar = lastNode.bar + 7; 

    prevNode.next = newNode; //newNode is inserted into the structure - lastNode dies :(
} 
+0

OP не требует использования рекурсии. Если он/она просто ищет самый глубокий вектор, он может использовать цикл while и стек. рекурсия si, вероятно, проще, но неверно сказать hhat, что это единственный способ. – atk

+0

Но насколько я знаю в этой ситуации, когда вы меняете контент lastNode в основном, контент самого глубокого вектора не изменяется. Я прав? –

+0

@atk: Мой стандартный ответ на этот вопрос - «использовать стек». Вы можете выбирать между неявным (стек вызовов, с рекурсией) или явным. Это более корректно, чем «рекурсия - единственный способ», и она включает в себя вариант рекурсии. –

1

в ответ на Сиф, вот как вы бы это сделать Жека НТКК. псевдокод, вероятно, изобилует опечатками, просто для описания идеи ...

примечание: страдает от той же проблемы, что и рекурсивные решения, где обратные ссылки могут вызывать бесконечные циклы. если память не является проблемой, сохраните список всех используемых во всех случаях (или, возможно, флаг в каждом элементе, чтобы указать, если следовать), или используйте пересекающиеся циклы incr &, пропустите 1, если память является проблемой. или просто установить. максимум ломит на глубину, которую вы пройдете.

 
// breadth first search to find deepest element 
FIND_DEEPEST: 
GIVEN tree; // vector of vectors 
DECLARE current, previous // stacks for the current depth and one level up 
DECLARW node, children, child // temp vars 

current = COPY(tree); 
WHILE current != NIL 
    previous = current; 
    current = nil; 
    WHILE previous IS NOT empty 
    node = POP(previous);  
    APPEND CHILDREN(node) TO current; // CHILDREN just pops all elements of node 
             // APPEND operates on lists, like in Perl  

Смежные вопросы