使用Stack实现链接列表反转

时间:2016-03-20 05:30:53

标签: data-structures linked-list stack

我正在尝试使用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循环。你能帮忙吗?

4 个答案:

答案 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=0i==0声明的条件下应为if;
  • 当您从堆栈中弹出非头节点时,您没有进行任何链接;您应该说prev.next = curr之类的内容currprev以明显的方式定义;
  • 该函数定义为返回(引用)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类中触及。