我正在尝试使用Stack来反转链接列表。
Node Reverse(Node head) {
Stack<Node> x = new Stack<Node>();
Node curr = new Node();
curr= head;
while (curr!=null){
x.push(curr);
curr=curr.next;
}
int i=0;
while(!x.isEmpty()){
if (i=0){
head=x.pop();
i++;
}
else{
Node temp = new Node();
temp = x.pop();
}
}
}
这是我的代码。我陷入了while循环。你能帮忙吗?
答案 0 :(得分:1)
下面的代码将在无限循环中运行。
if (i=0){
head=x.pop();
i++;
}
您应该将i=0
更改为i==0
if (i==0){
head=x.pop();
i++;
}
答案 1 :(得分:0)
Node Reverse(Node head) {
Stack<Node> x = new Stack<Node>();
Node curr = new Node();
curr= head;
while (curr!=null){
x.push(curr);
curr=curr.next;
}
Node temp = new Node();
temp=x.pop();
head=temp;
x.pop();
while(!x.isEmpty()){
temp = x.pop();
if (x.peek()!=null){
temp.next=x.peek();
}
else{
temp.next=null;
}
x.pop();
temp=temp.next;
}
return head;
}
我已经带头直到这里。但仍然无法处理空堆栈异常。
这不是最终解决方案。
答案 2 :(得分:0)
代码至少有三个问题:
i=0
在i==0
声明的条件下应为if
; prev.next = curr
之类的内容curr
和prev
以明显的方式定义; Node
;你提供的代码不会返回任何内容。另外,我建议使用以下迭代方法,这种方法更简单,更有效。
/* ... */
typedef struct node_t_ node_t;
struct node_t_ {
node_t *next;
int v;
};
/* ... */
node_t *reverse(node_t *head) {
node_t *curr, *prev, *temp;
prev = NULL;
curr = head;
while (curr != NULL) {
temp = curr->next;
curr->next = prev;
prev = curr;
curr = temp;
}
return prev;
}
我用C编写了代码;你应该没有问题将它转换为Java。
答案 3 :(得分:0)
编程的核心是抽象。通过抽象接口后面的链表,可以使代码变得更简单(并因此更容易)。一旦你完成它,通过堆栈的反转就像这样简单:
void Reverse(LinkedList<T> list) {
Stack<T> stack = new Stack<T>();
while (! list.IsEmpty())
stack.Push(list.RemoveFront());
while (! stack.IsEmpty())
list.AppendBack(stack.Pop());
}
也就是说,将列表视为具有自己接口的单元,而不是在客户端代码中传递节点。节点仅在内部 LinkedList
类中触及。