2016-03-20 44 views
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; 

    } 
    int i=0; 
    while(!x.isEmpty()){ 
     if (i=0){ 
      head=x.pop(); 
      i++; 
     } 
     else{ 
      Node temp = new Node(); 
      temp = x.pop(); 
     } 
    } 
} 

这是我的代码。我被困在while循环中。能否请你帮忙。?

回答

1

下面的代码将无限次地在while循环中运行。

if (i=0){ 
      head=x.pop(); 
      i++; 
     } 

你应该改变i=0i==0

if (i==0){ 
       head=x.pop(); 
       i++; 
      } 
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; 
} 

我已经采取了领先到这里。但仍然无法处理空栈异常。

这不是最终的解决方案。

0

有至少三个问题的代码:

  • 如前所述,i=0应在if声明的条件i==0;
  • 当你从堆栈中弹出一个非头节点时,你没有做任何链接;你应该可以说类似于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。

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类中。