C# 插入到通用链表中

C# 插入到通用链表中,c#,generics,insert,linked-list,C#,Generics,Insert,Linked List,我在将新对象插入链接列表时遇到问题。我使用一个名为Insert的自定义方法,该方法获取对象类型和它应该放置的索引。但是,当我插入对象时,列表不会更新。知道为什么吗 名单如下: GenericLinkedList<string> bet = new GenericLinkedList<string>(); bet.Add("a"); bet.Add("b"); bet.Add("c"); bet

我在将新对象插入链接列表时遇到问题。我使用一个名为Insert的自定义方法,该方法获取对象类型和它应该放置的索引。但是,当我插入对象时,列表不会更新。知道为什么吗

名单如下:

        GenericLinkedList<string> bet = new GenericLinkedList<string>();
        bet.Add("a");
        bet.Add("b");
        bet.Add("c");
        bet.Add("d");

        //bet.Remove();
        bet.Insert("x", 2);
通用链接列表类:

public class GenericLinkedList<T> where T : IComparable<T> 
{

    public GenericLinkedList()
    {
        count = 0;
        head = null;
    }

    #region Nested Node Class
    private class Node<T>
    {
        private T data;
        public T Data
        {
            get { return data; }
            set { data = value; }
        }

        private Node<T> next;
        public Node<T> Next
        {
            get { return next; }
            set { next = value; }
        }

        public Node<T> Previous { get; set; }


        public Node(T obj_t)
        {
            next = null;
            data = obj_t;
        }
        public Node()
        {
            next = null;
        }


    }
    #endregion

    private Node<T> head;
    private Node<T> tail;


    private int count;
    public int Count
    {
        get
        {
            int num;
            if (count < 0)
                num = 0;
            else {
                num = count;
            }
            return num;
        }
    }
}

插入方法:

    public void Insert(T data, int index)
    {
        Node<T> replacedItem = new Node<T>();
        Node<T> newItem = new Node<T>(data);

        if (head == null)
        {
            head = new Node<T>(data);
            tail = head;
        }
        else
        {
            Node<T> current = head;
            Node<T> tempNode = new Node<T>();


            if (index > 0 && index <= count + 1)
            {
                int c = 0;
                while (current != null)
                {
                    if (c == index)
                    {
                        tempNode = current;
                        current = newItem;
                        current.Next = tempNode;
                    }
                    else
                    {
                        current = current.Next;
                    }
                    c++;
                }
            }
            count++; 
        }
    }
添加方法:

  public void Add(T data)
    {
        count++;

        if (head == null)
        {
            head = new Node<T>(data);
            tail = head;
        }
        else
        {
            tail.Next = new Node<T>(data);
            tail.Next.Previous = tail;
            tail = tail.Next;
        }
    }

如果head为null,则需要添加count+。此外,如果在Insert方法中未正确添加新项,则count++应进入ifindex>0&&index 在这个地方

tempNode = current; // save pointer to current item
current = newItem; // save in current new item
current.Next = tempNode; //set next to counter
但你们并没有改变上一个元素的链接,所以当你们再次离开头部时,你们只是错过了你们添加的项目

你需要像这样修改代码

public void Insert(T data, int index)
{
    Node<T> replacedItem = new Node<T>();
    Node<T> newItem = new Node<T>(data);

    if (head == null)
    {
        head = new Node<T>(data);
        tail = head;
        count++;
    }
    else
    {
        Node<T> current = head;
        Node<T> tempNode = new Node<T>();


        if (index > 0 && index <= count + 1)
        {
            int c = 0;
            while (current != null)
            {
                if (c == index)
                {
                    tempNode = current;
                    current = newItem;

                    //update link from previous element
                    if(tempNode.Previous != null) 
                       tempNode.Previous.Next = current;

                    current.Next = tempNode;
                    current.Previous = tempNode.Previous;
                    tempNode.Previous = current;
                    count++;
                    break;
                }
                else
                {
                    current = current.Next;
                }
                c++;
            }
        }             
    }
}

您也可以提供方法Add吗?同样在Insert方法中,即使不添加新节点,您也会增加计数。如果head为null,则计数应为0。如果head为null,我们将添加第一个元素。因此计数应该增加,否则该元素将不被计数。@user2453973,如果您想在索引0处插入,我还认为有一个问题
public void Insert(T data, int index)
{
    Node<T> replacedItem = new Node<T>();
    Node<T> newItem = new Node<T>(data);

    if (head == null)
    {
        head = new Node<T>(data);
        tail = head;
        count++;
    }
    else
    {
        Node<T> current = head;
        Node<T> tempNode = new Node<T>();


        if (index > 0 && index <= count + 1)
        {
            int c = 0;
            while (current != null)
            {
                if (c == index)
                {
                    tempNode = current;
                    current = newItem;

                    //update link from previous element
                    if(tempNode.Previous != null) 
                       tempNode.Previous.Next = current;

                    current.Next = tempNode;
                    current.Previous = tempNode.Previous;
                    tempNode.Previous = current;
                    count++;
                    break;
                }
                else
                {
                    current = current.Next;
                }
                c++;
            }
        }             
    }
}