我有以下代码扭转链表:学习到反向链接列表
public class ProgrammingInterviews {
public static void main(String[] args) {
List list = new List();
list.add(new Node(1));
list.add(new Node(2));
list.add(new Node(3));
list.add(new Node(4));
list.reverse();
System.out.println(list);
}
}
class List {
Node head;
public List() {
head = new Node(0);
}
public void add(Node node) {
if (head.next == null) {
head.next = node;
} else {
Node temp = head.next;
while (temp.next != null) {
temp = temp.next;
}
temp.next = node;
}
}
public void reverse() {
this.head = reverse(this.head);
}
private Node reverse(Node n) {
if (n == null || n.next == null) {
return n;
}
Node remaining = reverse(n.next);
n.next.next = n;
n.next = null;
return remaining;
}
public String toString() {
Node temp = head;
String result = "HEAD";
while (temp.next != null) {
result = result + "->" + temp.next.data;
temp = temp.next;
}
return result;
}
}
class Node {
int data;
Node next;
public Node(int data) {
this.data = data;
}
}
我试图把它打印HEAD->4->3->2->1
与无济于事。但是,它正在打印HEAD->3->2->1
。有什么我失踪了吗?
此外,如果您有如何解决这些类型的问题的提示,它真的会帮助我。我一直在编程一段时间。这对解决问题非常有用。我很容易想出天真的解决方案。但是,在数据结构和算法领域,我们通过不同的想法/方式想出一个解决方案,我总是认为它很短。
例如,在这个问题中,我从来没有想过使用递归有一个解决方案。我正在使用在其他地方查找的解决方案。如果我得到一些能够帮助我解决这些问题的技巧,这将会非常有帮助。
了解如何使用调试器来执行分步代码。 –
这样写的方式让我想起了一个很棒的网站,我喜欢练习我的代码。 [HackerRank - 扭转链接列表](https://www.hackerrank.com/challenges/reverse-a-linked-list)。既然你的标题说明你正在学习,我觉得这是一个扩展你的技能的好地方。:) –