2016-07-25 167 views
-1

我'試圖扭轉循環雙向鏈表,它看起來像這樣: It looks like this在C#反雙向鏈表

這裏是我的節點類:

 private class Node<T> 
    { 
     public T Data { get; set; } 
     public Node<T> PreviousNode { get; set; } 
     public Node<T> NextNode { get; set; } 

     public Node(object data, Node<T> next, Node<T> previous) 
     { 
      Data = (T) data; 
      PreviousNode = previous; 
      NextNode = next; 
     } 
    } 

這裏是我的一部分鏈表類,這裏是我的反向funtion存儲:

public class DoublyLinkedList<T> :IList<T> 
{ 
    private Node<T> headerNode; 
public DoublyLinkedList() 
{ 
     headerNode = new Node<T>(null, null, null); 

     headerNode.NextNode  = headerNode; 
     headerNode.PreviousNode = headerNode; 
     Count = 0; 
} 

    public void Insert(int index, T item) 
    { 
     Node<T> node; 

     if (index == Count) 
      node = new Node<T>(item, headerNode, headerNode.PreviousNode);                 
     else 
     { 
      Node<T> tmp = FindNodeAt(index); 

      node = new Node<T>(item, tmp, tmp.PreviousNode); 
     } 

     node.PreviousNode.NextNode = node; 
     node.NextNode.PreviousNode = node; 

     Count++; 

    } 
public void Reverse() 
    { 
     Node<T> temp; 
     for (Node<T> node = headerNode.NextNode; node != headerNode; node = node.NextNode) 
     { 

     } 
    } 

我完全地堅持這一反向()函數。任何幫助?

+1

您可以遍歷交換下一個和上一個節點的列表。 – phuzi

+2

你想扭轉當前列表或創建一個與當前列表相反的新列表嗎? – ChrisF

+0

你可以簡單地引入'bool IsReversed'屬性,它將改變所有方法的索引編號和枚舉。 – Sinatr

回答

2

如果要扭轉目前的名單 - 那麼這應該工作:

public void Reverse() 
{ 
    if (count < 2) 
    return; 

    Node<T> node = headerNode; 
    do 
    { 
     Node<T> temp = node.NextNode; 
     node.NextNode = node.PreviousNode; 
     node.PreviousNode = temp; 
     node = temp; 
    } 
    while (temp != headerNode) 
} 

第一線檢查空或單元素列表。主循環通過交換先前的下一個節點的列表進行迭代,當其返回到頭節點時停止。結果是一個顛倒的列表。

+0

這就是我談到的!謝謝。 –

2

而不是反轉列表爲什麼不寫一對夫婦說得到取決於方向標誌名單是在通過了「下一個」和「上一個」節點方法:

public Node Next(Node current, bool forward) 
{ 
    return forward ? current.NextNode : current.PreviousNode; 
} 

public Node Previous(Node current, bool forward) 
{ 
    return forward ? current.PreviousNode : current.NextNode; 
} 

您可以取代bool forward通過枚舉值Forwards & Backwards如果這會使代碼更易於閱讀。

+0

這很好,謝謝。但是我需要使用Reverse()方法,因爲這是一種測試任務。 –

7

算法逆轉鏈表是很簡單的:

  • 是列表空或者一個元素?如果是,那麼它已經被扭轉。
  • 否則,創建一個新的空列表。在循環中,從舊列表中刪除第一項並將其添加到新列表的開頭。循環直到第一個列表爲空。

所以,把它分成小塊。你能寫下如下方法:(1)檢查列表是否爲空(2)或一個元素(3)從非空列表中刪除第一個項目,(4)將項目放到列表的頭部?如果您可以編寫這四種方法,那麼您可以將它們結合在一起以寫入反轉。

這就是你應該如何接近你的編程問題;編程就是將複雜的問題分解爲簡單的問題,解決簡單的問題,並將解決方案結合起來。

1

謝謝大家,我找到了解決辦法。

public void Reverse() 
    { 
     var currNode = headerNode; 
     do 
     { 
      var temp = currNode.NextNode; 
      currNode.NextNode = currNode.PreviousNode; 
      currNode.PreviousNode = temp; 
      currNode = currNode.PreviousNode; 
     } 
     while (currNode != headerNode); 
    }