2014-11-03 2 views
1

--- Мой класс узел ---Очереди/узлы Java, что делает этот метод?

class Node<E> { 
     public E data; 
     public Node<E> next; 

     Node(E data, Node<E> next) 
     { 
      this.data = data; 
      this.next = next; 
     } 
    } 

--- Мой метод тайна, которая влияет на мой список ---

public Node <E> mystery < E extends Comparable > (Node <E> first, E x) { 
Node <E> p2 = null; 
Node <E> p1 = first; 
while (p1 != null && x.compareTo(p1.data) != 0) { 
    p2 = p1; 
    p1 = p1.next; 
} 
if (p1 != null) { 
    if (p1 == first) { 
     first = first.next; 
    } else { 
     p2.next = p1.next; 
    } 
} 
return first; 
} 

Я попытался преобразовать мой метод «тайна» в «psuedocode», чтобы попытаться понять его лучше. Но я все еще не понимаю, что он делает.

--My psuedocode--

-----While loop------ 
While p1 is not null/empty, and while x is not equal to p1 
Set p2 equal to p1 
and set p1 equal to p1.next 

----If Statements------ 
if p1 is not empty/null and if p1 is equal to the first item in the list 
    then set first to first.next (moving the pointer) 

if none of the above is able to be ran 
    then set p2.next equal to p1.next 

and return first. 

Мой список выглядит следующим образом ... PTR [] -> [10] [] -> [20] [] -> [30 ] [] -> [40] [] -> [50] [Ø]

Мне нужно понять, что мой метод тайны делает точно, и уметь видеть, что произойдет с этим списком, если что-то вроде это называлось: ptr = mystery (ptr, 50);

Любая помощь будет отличной. Я застрял на этом некоторое время ... Спасибо.

+0

«Что произойдет со списком, если что-то вроде этого было вызвано: ptr = mystery (ptr, 50); вы не можете запустить его и выяснить (используя отладчик, если вам нужно) –

+0

Место для начала будет спрашивать себя Что делает цикл while? Конечно, вы изменили код на «psuedocode», но какова цель этого цикла? В частности, каково значение 'p1' и' p2', когда цикл завершается? – clcto

+0

Я думаю, что это его основная проблема @clcto, он не уверен и не написал ее. – AnthonyJClink

ответ

1
Node <E> p2 = null; 
    Node <E> p1 = first; 
    while (p1 != null && x.compareTo(p1.data) != 0) { 
     p2 = p1; 
     p1 = p1.next; 
    } 

Это означает: не ходить элементы в связанном списке до тех пор, как:

  • Вы нашли элемент, равный x
    • В этом случае p1 содержит элемент, и p2 является узлом до p1
  • Вы дойдете до конца (не нашли элемент, равный x)
    • В этом случае p1 является null
if (p1 != null) { 
    if (p1 == first) { 
     first = first.next; 
    } else { 
     p2.next = p1.next; 
    } 
} 
return first; 

Что будет:

  • Если p1 - null, это означает, что элемент x нет в списке связанных друг с другом.if терпит неудачу, и метод возвращает first неизменного
  • Если p1 не null, это означает, что элемент x был найден, содержащимся в p1
    • Если p1 является first узлом, а затем возвращают второй узел
    • В противном случае сделать p2.next пункт p1.next, и возвращают первый узел

Вкратце: метод ищет узел, содержащий x, если он находит его, он удаляет его. Метод возвращает первый узел, или если он был удален, то второй узел.

+0

Удивительный ответ. Я получаю это сейчас. Большое вам спасибо за вашу помощь! Я должен быть в состоянии продолжать сейчас и все выяснить. – user3261569

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