2017-05-13 63 views
0

我在学习一些关于链表和双链表的知识。C#双向链表 - 上一个和下一个不会连接

我试图建立一个双向链接列表与前一个和下一个节点,但当我debbug程序“指针”将不会连接到他们应该的地方彼此。在程序运行结束时,打印出的唯一重要值是我想要输入列表中的最后一个值,这是列表中唯一的值。

这是我的代码,我相信它应该没问题,因为'previous'和'next'节点不会互相连接。

Node<T> start; 
    Node<T> end; 

    public void AddFirst(T dataToAdd) 
    { 
     Node<T> tmp = new Node<T>(dataToAdd); 
     if (start == null) 
     { 
      start = tmp; 
      end = start; 
     } 
     tmp.next = start.previous; 
     end.next = tmp.previous; 
     start = tmp; 


     if (start.next == null) 
     { 
      end = start; 
     } 
    } 

    public void AddLast(T dataToAdd) 
    { 
     Node<T> tmp = new Node<T>(dataToAdd); 
     if (start == null) 
     { 
      AddFirst(dataToAdd); 
     } 

     tmp.next = start.previous; 
     end.next = tmp.previous; 
     end = tmp; 
    } 

    public T RemoveFirst() 
    { 
     if (start == null) return default(T); 

     T saveVal = start.data; 
     end.next = start.next.previous; 
     start = start.next; 
     if (start == null) end = null; 

     return saveVal; 
    } 

    public T RemoveLast() 
    { 
     if (start == null) return default(T); 

     T saveVal = end.data; 
     end.previous.next = start.previous; 
     end = end.previous; 

     if (start == null) end = null; 

     return saveVal; 
    } 


    public void PrintAll() 
    { 
     Node<T> tmp = start; 
     while (tmp != null) 
     { 
      Console.WriteLine(tmp.data); 
      tmp = tmp.next; 
     } 
    } 

    class Node<T> 
    { 
     public T data; 
     public Node<T> next; 
     public Node<T> previous; 

     //etc 

     public Node(T newData) 
     { 
      data = newData; 
      next = null; 
      previous = null; 

     } 

    } 
} 
+0

[双向链表C#(https://gist.github.com/yetanotherchris/4960171) – CodingYoshi

+0

我想你应该尝试写一些单元测试你的代码,并在其中添加代码的一部分一次。特别是,我怀疑为什么'end.next = tmp.previous;'在那里根本就没有,或者至少** **。 –

+0

@CodingYoshi谢谢!我会按照你的例子,并检查我做错了什么! – Dolev

回答

1

几乎所有的方法中几乎没有连接问题。我修改了相同的,它工作正常。

public class DoubleLinkedList <T> 
{ 
    Node<T> start; 
    Node<T> end; 

    public void AddFirst(T dataToAdd) 
    { 
     Node<T> tmp = new Node<T>(dataToAdd); 
     if (start == null) 
     { 
      start = tmp; 
      end = start; 
      return; 
     } 
     start.previous = tmp; 
     tmp.next = start; 
     start = tmp; 


     if (start.next == null) 
     { 
      end = start; 
     } 
    } 

    public void AddLast(T dataToAdd) 
    { 
     if (start == null) 
     { 
      AddFirst(dataToAdd); 
      return; 
     } 
     Node<T> tmp = new Node<T>(dataToAdd); 
     end.next = tmp; 
     tmp.previous = end; 
     end = tmp; 
    } 

    public T RemoveFirst() 
    { 
     if (start == null) return default(T); 

     T saveVal = start.data; 
     start = start.next; 
     start.previous = null; 
     if (start == null) end = null; 

     return saveVal; 
    } 

    public T RemoveLast() 
    { 
     if (start == null) return default(T); 

     T saveVal = end.data; 
     end = end.previous; 
     end.next = null; 
     if (start == null) end = null; 

     return saveVal; 
    } 


    public void PrintAll() 
    { 
     Node<T> tmp = start; 
     while (tmp != null) 
     { 
      Console.WriteLine(tmp.data.ToString()); 
      tmp = tmp.next; 
     } 
    } 
} 
+0

我修复了我的代码。我现在知道我的问题在哪里。我需要使用更多步骤来打破链接之间的连接,因为我拥有Next和Previous。谢谢! – Dolev

+0

太棒了。如果它适合你。请将其标记为“已接受的答案”并给予赞成。 :) –

相关问题