2016-03-20 77 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類中。