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个元素,然后运行我犯了这个不寻常的错误!