Метод замены узлов связанного списка в позициях a и b, застрявший в бесконечном цикле в Java - PullRequest
0 голосов
/ 12 декабря 2018

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

вот метод:

    public void swap(LinkedList L1, int start, int end) {
    Node ptr1, prev1, ptr2, prev2;

    ptr1 = head;
    prev1 = ptr1;
    int count1 = 0;
    int count2 = 0;
    if ((start <= size()) && (start > 0) && (end <= size()) && (end > 0)) {
        while (count1 != start && ptr1 != null) {
            prev1 = ptr1;
            ptr1 = ptr1.link;
            count1++;
        }
        ptr2 = head;
        prev2 = ptr2;
        while (count2 != end && ptr2 != null) {
            prev2 = ptr2;
            ptr2 = ptr2.link;
            count2++;
        }
        prev1.setLink(prev2.link);
        ptr2.setLink(ptr1.link);
        prev2.setLink(ptr1.link);
        ptr1.setLink(ptr2.link);
    }
}

и вот основной метод, в котором я пытаюсь проверить метод:

    public static void main(String[] args) {
    LinkedList L1 = new LinkedList();
    L1.addToStart(5);
    L1.addToStart(7);
    L1.addToStart(23);
    L1.addToStart(56);
    L1.addToStart(52);
    L1.addToStart(22);
    L1.addToStart(57);
    L1.addToStart(99);
    L1.addToStart(34);
    L1.addToStart(74);
    L1.outputList();
    L1.swap(L1, 2, 4);
    L1.outputList();

1 Ответ

0 голосов
/ 13 декабря 2018

Вы неправильно связываете вещи.Вы делаете ссылки ptr2 и prev2 на ptr1.link.

Предположим, что это список

A -> B -> C -> D -> E -> F

, и мы хотим переключить B и E.

prev1 = A
ptr1  = B
prev2 = D
ptr1  = E

Пересмотрено, это выглядит как

A -> B -> C -> D -> E -> F
|-------------------^
     |-------------------^
          ^---------|
      ^--------|
A -> E -> C -> D -> B -> F

В коде:

Node temp = ptr1.link;
prev1.setLink(ptr2);
ptr1.setLink(ptr2.link);
prev2.setLink(ptr1);
ptr2.setLink(temp);
...