2016-07-25 164 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); 
    }