Java 反转链接列表

Java 反转链接列表,java,linked-list,Java,Linked List,在不使用递归的情况下反转链表时出现的问题 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) {

在不使用递归的情况下反转链表时出现的问题

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();
    }
}
我使用了这种方法,但当我尝试在家中运行时,我无法打印链接列表的反面,即使函数看起来很好,它会继续以与前面相同的方式打印链接列表

有人能帮我理解这里出了什么问题吗

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();
     }
}
检查您的状况: 而(我是空的(头))


您忘了添加“!”您的意思是,虽然不是空的。。。请考虑在打印链接时递归方法的作用。它实际上什么都不做,直到它拥有了所有的调用(即,它将每个调用放在堆栈上,然后当到达基本情况时,它从堆栈中弹出元素)


您有什么现成的非堆栈结构可以用来存储列表的反面,然后让您打印出来?

代码中有两个问题。第一:你检查的地方是空的(头),因为你应该检查!我空着(头)。第二:当您修复第一个问题时,当循环终止时,“head”变为null

以上两个问题的正确代码和修复程序:

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

}

用于在不递归的情况下反转链表的更正代码

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();
    }
}

当你运行它时会发生什么?使用调试器逐步检查代码时,您看到了什么?对于长度为0个项目的链表是否有效?1件?2项?如果你让它适用于3,它将适用于任何数字…此代码将新条目添加到前面的列表中,因此如果你运行printlist函数,你应该按照与添加条目相反的顺序写出条目。这不是你想要实现的吗?也许你需要澄清这个问题。代码的目的是首先创建一个链表。50-40-30-20-10-NULL然后将其反转10-20-30-40-50-NULL现在完成了,我想知道,对于给定的K值,我如何才能反转K个元素。有人能帮我反转链接列表中的每个K元素吗?是的,我发现了,还有一个问题,谢谢大家!如果你看上面的修正,它可以不使用递归来完成。我很清楚这一点。我的回答没有给出代码,而是鼓励OP思考他们想如何解决问题——当你谈论概念时,代码是不必要的。然后我有一个问题要问你,什么是更好的方法,我的一点经验告诉我,如果手头有迭代解决方案,应该避免使用堆栈。您对此有何看法?这取决于您将递归执行多少操作,以及堆栈有多大。理想情况下,对于此操作,您希望以迭代方式执行,因为无法判断列表是否会扩展到比堆栈大的大小。递归地表示解决方案可能更容易、更清晰,但迭代地表示解决方案会减少堆栈上的调用。谢谢,我已经了解了这一点,但由于我是新手,无法在8小时前粘贴答案:(很好,你很快就发现了,我花了很多时间才发现错误,谢谢!现在完成了,我想知道,对于给定的K值,我如何反转K个元素。你是说反转前K个元素?如果是这样,你想让其他元素保持在前K个元素之后吗?嗨,Niraj,我正在反转K个元素,然后运行我犯了这个不寻常的错误!