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

Проблема в Обращении связанного списка без использования рекурсии.

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

Может кто-нибудь помочь мне понять, что здесь не так ??

class link {
    int data;
    public link nextlink;

    link(int d1) {
        data = d1;
    }
}

class List{

    link head;
    link revhead;

    List(){
        head = null;
    }

    boolean isEmpty(link head) {
       return head==null;
    }

    void insert(int d1) {
        link templink = new link(d1);
        templink.nextlink = head;
        head = templink;
    }

    void printlist(){
        link head1 = head;
        while(!isEmpty(head1)) {
            System.out.print(head1.data + " ");
            head1 = head1.nextlink;
        }
        System.out.println();
    }

    void reverse() {
        link previous=null,temp=null;
        while(isEmpty(head)) {
            temp = head.nextlink;
            head.nextlink = previous;
            previous = head;
            head = temp;
        }
    }

}

public class LinkedList {

    public static void main(String[] args) {

        List list1 = new List();

        list1.insert(10);
        list1.insert(20);
        list1.insert(30);
        list1.insert(40);
        list1.insert(50);
        list1.printlist();
        list1.reverse();
        list1.printlist();
     }
}
 netsameer17 мая 2012 г., 21:17
Теперь, когда это будет сделано, мне интересно, как я могу перевернуть когда-либо K элементов для заданного значения K.
 eabraham17 мая 2012 г., 19:53
Это домашняя работа?
 Jay17 мая 2012 г., 19:58
Этот код добавляет новые записи в список спереди, поэтому если вы запускаете функцию printlist, вы должны записывать записи в порядке, обратном тому, как вы их добавили. Разве это не то, что вы пытаетесь достичь? Возможно, вам нужно уточнить вопрос.
 Tony Ennis17 мая 2012 г., 19:54
Что будет, когда ты запустишь его? Что вы увидели, когда прошли по коду с помощью отладчика? Работает ли он в связанном списке длиной 0 пунктов? 1 предмет? 2 предмета? Если вы заставите его работать на 3, он будет работать для любого числа ...
 netsameer17 мая 2012 г., 21:14
Цель кода - сначала создать связанный список. 50-40-30-20-10-NULL Затем поменять его на 10-20-30-40-50-NULL

Ответы на вопрос(5)

class Node {
    Node next;
    int value;

    public Node() {
    }

    public Node(Node next, int value) {
        super();
        this.next = next;
        this.value = value;
    }

    public Node getNext() {
        return next;
    }

    public void setNext(Node next) {
        this.next = next;
    }

    public int getValue() {
        return value;
    }

    public void setValue(int value) {
        this.value = value;
    }

}

public class Linkedlist {
    private Node head = null;

    public Linkedlist(Node head) {
        this.head = head;
    }

    public void iterate() {
        Node current = head;
        while (current != null) {
            System.out.println(current.getValue());
            current = current.getNext();
        }
    }

    public void reverse() {
        Node current = head;
        Node prev = null;
        while (current != null) {
            Node temp = current.next;
            current.next = prev;
            prev = current;
            current = temp;
        }
        head = prev;
    }

    public static void main(String[] args) {
        Node n = new Node(null, 10);
        Node n1 = new Node(n, 20);
        Node n2 = new Node(n1, 30);
        Node n3 = new Node(n2, 40);
        Node n4 = new Node(n3, 50);
        Node n5 = new Node(n4, 60);
        Linkedlist linkedlist = new Linkedlist(n5);
        linkedlist.iterate();
        linkedlist.reverse();
        System.out.println("------------------REVERSED---------------------");
        linkedlist.iterate();

    }
}
 Pramod06 мар. 2016 г., 06:25
когда это не сработает

Исправленный код для обращения связного списка без рекурсии.

class Link {

    int data;
    public Link nextLink;

    Link(int d1) {
        data = d1;
    }
}

class List {

    Link head;
    Link revhead;

    List() {
        head = null;
    }

    boolean isEmpty(Link head) {
        return head == null;
    }

    void insert(int d1) {
        Link tempLink = new Link(d1);
        tempLink.nextLink = head;
        head = tempLink;
    }

    void printlist() {
        Link head1 = head;
        while (!isEmpty(head1)) {
            System.out.print(head1.data + " ");
            head1 = head1.nextLink;
        }
        System.out.println();
    }

    void reverse() {
        Link previous = null, temp = null;
        while (!isEmpty(head)) {
            temp = head.nextLink;
            head.nextLink = previous;
            previous = head;
            head = temp;
        }

        head = previous;
    }
}

public class Main {

    public static void main(String[] args) {

        List list1 = new List();

        list1.insert(10);
        list1.insert(20);
        list1.insert(30);
        list1.insert(40);
        list1.insert(50);
        list1.printlist();
        list1.reverse();
        list1.printlist();
    }
}
Решение Вопроса

вы проверяете isEmpty (head), где, как следует проверять! IsEmpty (head). Второе: когда вы решаете первую проблему, после завершения цикла «голова» становится нулевой.

Правильный код с исправлением вышеупомянутых двух проблем:

void reverse() {
    link previous = null, temp = null;
    while (!isEmpty(head)) {
        temp = head.nextlink;
        head.nextlink = previous;
        previous = head;
        if (temp == null) {
           break;
        }
        head = temp;
    }

}
 netsameer17 мая 2012 г., 21:09
Спасибо, разобрался, но, поскольку я новичок, не могу вставить ответы до 8 часов :( Хорошо, что ты это быстро понял, мне понадобилось много времени, чтобы уловить ошибку, спасибо!
 Niraj Nawanit17 мая 2012 г., 22:08
Вы имеете в виду изменение первых K элементов? Если да, то вы хотите оставить другие элементы после первых K элементов такими, какие они есть?
 netsameer22 мая 2012 г., 21:22
Привет, Нирадж, я работал над изменением K elemnts и столкнулся с этой необычной ошибкой!
 netsameer17 мая 2012 г., 21:18
Теперь, когда это сделано, мне интересно, как я могу изменить когда-либо K элементов для заданного значения K.

ты забыл добавить "!" ты имел ввиду пока не пустой ... делай

 netsameer17 мая 2012 г., 20:57
Да, я понял это вместе с еще одной проблемой, большое спасибо, ребята!

что делает рекурсивный метод, когда вы печатаете ссылки. На самом деле он ничего не делает, пока не получит их все (т. Е. Он помещает каждый вызов в стек, затем, когда достигается базовый случай, он извлекает элементы из стека).

Какая структура, не относящаяся к стеку, у вас есть, которую можно использовать для хранения обратной части списка, а затем распечатать?

 Makoto17 мая 2012 г., 21:01
Я хорошо это знаю. Мой ответ не дает кода, а скорее побуждает OP задуматься о том, как они хотят найти свое решение - код не нужен, когда вы говорите о концепциях.
 netsameer17 мая 2012 г., 20:58
Если вы посмотрите на исправление выше, это можно сделать без использования рекурсии.
 netsameer17 мая 2012 г., 21:08
тогда у меня к вам вопрос: какой подход лучше? Мой небольшой опыт подсказывает мне, что следует избегать использования стека, если под рукой есть итеративное решение. Что вы скажете по этому поводу.
 Makoto17 мая 2012 г., 21:11
Это зависит от того, сколько операций вы бы сделали рекурсивно, и насколько велик ваш стек. В идеале, для этой операции вы хотели бы сделать это итеративно, поскольку невозможно определить, будет ли список расширяться до размера, превышающего размер стека. Это может бытьПолегч а такжеочистител, чтобы выразить решение рекурсивно, но делать это итеративно было бы меньше вызовов в стеке.

Ваш ответ на вопрос