2010-04-15 3 views
0

Linked-List: ЗеркалоСоздать зеркальную связанный список в Java

Рассмотрим следующий частный класс для узла однократно связанного списка целых чисел:

private class Node{ 
public int value; 
public Node next; 
} 

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

Напишите экземпляр-метод ListImpl с подписью:

public void mirror(); 

Это делает инверсное копию связанного списка, на который указывает начало и добавляет, что копируют до конца списка. Так, например, список:

начало 1 2 3

после вызова зеркало, становится:

начало 1 2 3 3 2 1

Примечание: в своем ответе вы не нужно добавить остальную часть класса для ListImpl только метод зеркала.

+0

Это похоже на HW. Как далеко вы пробовали? – codaddict

+0

Звучит очень много, как домашнее задание. Что вы сделали до сих пор? – zombat

ответ

1

Что вы хотите сказать? Это похоже на проблему упражнений. Вы ищете оптимизированное решение? Один из способов - просто перебрать список и добавить элементы в стек и, наконец, добавить их как узлы после итерации.

+0

Это звучит как решение n^2 - перебирать список и добавлять в стек, а затем перебирать стек? Как насчет того, чтобы построить связанный список, когда вы перебираете, затем прикрепите голову 3-2-1 к хвосту 1-2-3. –

+0

@Shakedown: Это не похоже на n^2-решение для меня. Итерация по списку занимает линейное время. Для каждого узла в списке его значение вставляется в стек в постоянное время. Следовательно, время, необходимое для создания полного стека, линейно. Нажатие всех значений из стека занимает линейное время. Для каждого значения добавление его в конец списка можно выполнить в постоянное время. Следовательно, время, необходимое для добавления новых узлов в список, линейно. Следовательно, вся операция линейна. –

+0

@Aeth: Да, вы правы - моя ошибка! –

0

Вы можете использовать этот подход:

Algorithm findLinkedListMirror 
    If list does not exist 
    return 

    Let start and end be pointers to type Node 
    Position start to the first node of the list 
    Position end to last node of the list 

    While(start != end.next) 
    Add a new node next to end with value start.data 
    start = start.next 
    End While 

End 
+0

Позиционирующий указатель на последний узел будет нуждаться в итерации в любом случае как его связанный список – Fazal

2
public void mirror() { 
    if (start != null) { 
     Node prev = null; 
     Node p = start; 
     Node q = null; 
     while (p != null) { 
      Node n = new Node(); 
      n.value = p.value; 
      n.next = q; 
      q = n; 
      prev = p; 
      p = p.next; 
     } 
     prev.next = q; 
    } 
} 
+0

Делает ли 'n.next = q; q = n; 'создать самосопряженный узел? –

+0

Нет. Он просто связывает новый узел с предыдущим –

1

Поскольку Морис предоставил looping solution, обеспечит рекурсивное решение.

void mirror() 
{ 
    if (start == null) return; 
    mirrorSublist(start); 
} 

// returns the last node of the mirrored sublist 
Node mirrorSublist(Node firstOfSublist) 
{ 
    Node lastOfSublist = new Node(); 
    lastOfSublist.value = firstOfSublist.value; 
    lastOfSublist.next = null; 
    if (firstOfSublist.next == null) 
    { 
     firstOfSublist.next = lastOfSublist; 
    } 
    else 
    { 
     Node secondToLastOfSublist = mirrorSublist(firstOfSublist.next); 
     secondToLastOfSublist.next = lastOfSublist; 
    } 
    return lastOfSublist; 
} 
Смежные вопросы