2017-01-25 3 views
0

Я создаю свой первый связанный список, и, хотя я понимаю, что списки с двойной связью действительно предназначены для возврата назад, я пытаюсь создать метод, который перемещает текущий узел назад в списке одним узлом в объединенном списке SINGLY.Перемещение назад в одиночном списке?

Вот что я до сих пор, я включил мои перейти к следующему для справки и конструкторов:

//Paramaterized construct 
    public ListNode(int aData, ListNode aLink) { 
    this.data= aData; 
    this.link = aLink; 
    } 
} 
private ListNode head; //First element 
private ListNode current; //Current node of interest 
private ListNode previous; //Node behind current 

public void goToNext() { 
    previous = current; 
    current = current.link; 
} 
//TODO: Fix previous 
public void goToPrev() { 
    if (current != head) { 
    } 
    else 
    System.out.println("Current node is the head, sorry"); 

Я забыл добавить свой частный класс ListNode:

private class ListNode 
{ 
    private int data; 
    private ListNode link; 
    //Default construct 
    public ListNode() 
    { 
     this.data = data; 
     this.link = link; 
    } 
    //Paramaterized construct 
    public ListNode(int aData, ListNode aLink) 
    { 
     this.data= aData; 
     this.link = aLink; 
    } 
} 

Я Думаю, что мне нужно выполнить итерацию с начала списка, пока не найду узел, который имеет next, равный моему текущему узлу. Но я не уверен, как точно настроить этот цикл и иметь правильное тело.

+0

Что до «головы»? –

+0

@DavidChoweller В моем случае «последователь» является предыдущим и каким будет лидером? Текущий? Я немного не уверен в том, что будет здесь последователем –

ответ

1

Для этого вам необходимо перебирать список с помощью двух указателей, а не одного. Хитрость заключается в том, чтобы иметь один впереди друг друга точно одним узлом, поэтому, когда указатель №1 находит интересующий узел, указатель №2 является узлом за ним в списке, и вы можете «переместиться назад», обратившись к №2.

+1

Или вы работаете только с одним указателем 'p' и проверяете, есть ли' p.link == current'. – Henry

+0

@Henry hmm один указатель звучит проще, чем два, мне любопытно –

+0

@ChrisM Я не хочу отдать полное решение, но если условие, упомянутое в моем предыдущем комментарии, истинно, какой узел является 'p', указывающим на ? – Henry

0

Вы не можете переименовывать отдельный список в обратном порядке. Если вы хотите повторить итерацию назад, вы должны будете дважды связать список. Или вы можете добиться этого, чтобы отредактировать узел перед повторением.

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