C#双链表 - 上一个和下一个不会连接

时间:2017-05-13 18:53:39

标签: c# linked-list doubly-linked-list

我正在学习链表和双链表。

我尝试使用上一个节点和下一个节点构建一个双链表,但是当我向程序调试时,"指针"不会在他们应该去的地方相互联系。在程序运行结束时,打印出来的唯一结果是我想要进入列表的最后一个值,这是值列表中的唯一值。

这是我的代码,我相信它应该正好适用于前一个'并且' 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;

        }

    }
}

1 个答案:

答案 0 :(得分: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;
        }
    }
}