代码之家  ›  专栏  ›  技术社区  ›  SoftwareGeek

创建通用链表类以创建对象链

  •  0
  • SoftwareGeek  · 技术社区  · 14 年前

    请解释一下这项任务是关于什么的?

    “创建一个通用链接列表类,使我们能够创建不同类型的链对象。”

    我们需要创建LinkedList类型的类并实现List接口吗?

    class LinkedList<T>:IList<T>
    {
       //implement interface methods here?
    }
    

    请举例说明。

    8 回复  |  直到 5 年前
        1
  •  0
  •   JSBÕ±Õ¸Õ£Õ¹    14 年前

    对于链表,我通常不建议实现 IList ,因为 伊利斯特 强烈暗示对列表中任何成员的持续时间访问。我建议实施 ICollection ,然后添加链接列表中不可或缺的其他方法,例如 PushFront , PopBack 等等。您可以查看 LinkedList<T> 比较类( http://msdn.microsoft.com/en-us/library/he2s3bh7.aspx ,但您应该单独实现类。

        2
  •  2
  •   Enigmativity    14 年前

    链表是一个特殊的列表,其中列表中的每个元素(或每个元素容器对象)都有对列表中下一项的直接引用(“链接”)。此类型的列表不是使用数组实现的。

    单链表通常只有到下一个项的链接,最后一个项为空以指示列表的结尾。

    双链接列表具有指向下一个项和上一个项的链接,并带有空值以指示列表的每一端。

    链表的优点是插入和删除非常快。遍历整个列表也有很好的性能,但是非线性搜索可能会很慢。

    通常,链表的实现应该实现 IEnumerable<T> 接口。实施 IList<T> 会促进低效线性搜索的使用。

    链接列表的.NET实现具有以下声明(减去一些不相关的要点)。

    LinkedList<T> : ICollection<T>, IEnumerable<T>, ICollection, IEnumerable
    

    如同 IList<t> 界面我不明白为什么 ICollection 安培; ICollection<T> 接口已经实现,但它们已经实现。

    元素容器对象(具有链接)如下所示:

    public sealed class LinkedListNode<T>
    {
        public LinkedListNode<T> Next { get; }
        public LinkedListNode<T> Previous { get; }
        public T Value { get; set; }
    }
    

    怎么样?

        3
  •  2
  •   Mussarat Aziz    14 年前

    您需要创建自己的通用链接列表的新类。这是完整的解决方案。根据上面的评论…希望能帮上忙..

    class Program
    {
    
        static void Main(string[] args)
        {
           // string linked List
            GenericsLinkedList<string> stringLinkedList = new GenericsLinkedList<string>(); //object 1
            string s1 = "Yes";
            string s2 = "No";
            string s3 = "True";
            string s4 = "False";
            stringLinkedList.AddHead(s1);
            stringLinkedList.AddHead(s2);
            stringLinkedList.AddHead(s3);
            stringLinkedList.AddHead(s4);
            //display List
            foreach (string str in stringLinkedList)
            {
                Console.WriteLine("----"+str);
            }
    
            //Integer LinkedList
            GenericsLinkedList<int> integerList = new GenericsLinkedList<int>();
            int n1 = 1;
            int n2 = 2;
            int n3 = 3;
    
            integerList.AddHead(n1);
            integerList.AddHead(n2);
            integerList.AddHead(n3);
    
            foreach (int Intger in integerList)
            {
                Console.WriteLine("----" + Intger);
            }
    
    
            Console.ReadKey();
    
    
        }
    }
    
    
    // Generic Linked List
    class GenericsLinkedList<T>
    {
        class LinkedlistNode
        {
            private LinkedlistNode next;
            private T item;
    
            public LinkedlistNode(T t)
            {
                next = null;
                item = t;
    
            }
            public LinkedlistNode Next
            {
                get
                {
                    return next;
                }
                set
                {
                    next = value;
                }
            }
            public T Item
            {
                get
                {
                    return item;
                }
                set
                {
                    item = value;
                }
            }       
        }
       private LinkedlistNode head;
       public GenericsLinkedList()
       {
           head = null;
       }
       public void AddHead(T t)
       {
           LinkedlistNode node = new LinkedlistNode(t);
           node.Next = head;
           head = node;
       }
       public IEnumerator<T> GetEnumerator()
       {
           LinkedlistNode current = head;
           while(current != null)
           {
               yield return current.Item;
               current = current.Next;
           }
    
       }
    
    }
    
        4
  •  1
  •   stealthyninja michkra    12 年前

    这可能是愚蠢的,因为这段代码以某种方式消除了泛型的含义,但我认为它们的意思是这样的。

    class Generic<T> 
    {
        public  T t;
    
    }
    static void Main(string[] args)
    {
        Generic<object>[] genericarray = new Generic<object>[3];
        for (int i = 0; i < genericarray.Length; i++)
            genericarray[i] = new Generic<object>();
        int a = 0;
        double b = 0.515151513163;
        string c = "s.dçfslsfn";
        genericarray[0].t = a;
        genericarray[1].t = b;
        genericarray[2].t = c;
    }
    
        5
  •  1
  •   Brad Larson    12 年前
    namespace GenericLinkedList
    {
    
    // generic linked list node
    public class GenericNode<T>
    {
        public T data;
        public GenericNode<T> nextNode = null;
    
        public GenericNode(T data)
        {
            this.data = data;
        }
    }
    
    // generic linked list
    public class GenericLinkedList<T>
    {
        private GenericNode<T> head = null;
    
        public void Add(T newListItem)
        {
            if (head == null)
            {
                head = new GenericNode<T>(newListItem);
            }
            else
            {
                GenericNode<T> curr = head;
                while (curr.nextNode != null)
                {
                    curr = curr.nextNode;
                }
                curr.nextNode = new GenericNode<T>(newListItem);
            }
        }
    
        public void DisplayNodes()
        {
            GenericNode<T> curr = head;
            while (curr != null)
            {
                System.Console.WriteLine(curr.data);
                curr = curr.nextNode;
            }
        }
    } 
    
    class TestGenericLinkedList
    {
        static void Main(string[] args)
        {
            GenericLinkedList<System.Object> gll = new GenericLinkedList<System.Object>();
            gll.Add(12);
            gll.Add("string");
            gll.Add(false);
            gll.DisplayNodes();
        }
        }
    }
    }
    
        6
  •  0
  •   blackweb    14 年前

    这样就可以了

    http://msdn.microsoft.com/en-us/library/0x6a29h6.aspx

    // type parameter T in angle brackets
    

    公共类泛型列表 { //t上的嵌套类也是泛型的。 私有类节点 { //t用于非泛型构造函数。 公共节点(t) { 下一个=空; 数据=t; }

        private Node next;
        public Node Next
        {
            get { return next; }
            set { next = value; }
        }
    
        // T as private member data type.
        private T data;
    
        // T as return type of property.
        public T Data  
        {
            get { return data; }
            set { data = value; }
        }
    }
    
    private Node head;
    
    // constructor
    public GenericList() 
    {
        head = null;
    }
    
    // T as method parameter type:
    public void AddHead(T t) 
    {
        Node n = new Node(t);
        n.Next = head;
        head = n;
    }
    
    public IEnumerator<T> GetEnumerator()
    {
        Node current = head;
    
        while (current != null)
        {
            yield return current.Data;
            current = current.Next;
        }
    }
    

    }

        7
  •  0
  •   Ricardo Vera    14 年前
        static void Main()
        {
            var list = new LinkedList<object>();
            list.AddLast("My string");
            list.AddLast(1.5);
            list.AddLast(2);
            list.AddLast(true);
    
            var en = list.GetEnumerator();
            while (en.MoveNext())
                Console.WriteLine(en.Current);
    
            Console.ReadKey();
        }
    
        8
  •  0
  •   Prabhath Amaradasa    7 年前

    更多功能,实现如下 http://msdn.microsoft.com/en-us/library/0x6a29h6.aspx

     public class GenericList<T>
    {
       private class Node
        {
    
            public Node(T t)
            {
                next = null;
                data = t;
            }
    
            private Node next;
            public Node Next
            {
                get { return next; }
                set { next = value; }
            }
    
    
            private T data;
    
    
            public T Data
            {
                get { return data; }
                set { data = value; }
            }
        }
    
        private Node head;
        private Node tail;
        private int count;
    
    
        public GenericList()
        {
            head = null;
            tail = null;
            count = 0;
        }
    
    
        public void AddHead(T t)
        {
            if (head == null)
                head = tail = new Node(t);
            else
            {
                Node n = new Node(t);
                n.Next = head;
                head = n;
            }
            count++;
        }
    
        public void AddTail(T t)
        {
            if(tail == null)
            {
                head = tail = new Node(t);
            }
            else
            {
                Node n = new Node(t);
                tail.Next = n;
                tail = n;
    
            }
            count++;
        }
    
    
        public void InsertAt(T t,int index)
        {
            if (index < 0 || index > count)
                throw new ArgumentOutOfRangeException();
            else if (index == 0)
                AddHead(t);
            else if (index == count)
                AddTail(t);
            else
            {
                Node currentNode = head;
                for (int i = 0; i < index - 1; i++)
                {
                    currentNode = currentNode.Next;
                }
                Node newNode = new Node(t);
                newNode.Next = currentNode.Next;
                currentNode.Next = newNode;
            }
            count++;
        }
    
    
        public void Reverse()
        {
            if (head == null || head.Next == null)
                return;
            tail = head;
           Node previousNode = null;
           Node currentNode = head;
          Node nextNode = head.Next;
            while (currentNode != null)
            {
                currentNode.Next = previousNode;
                if (nextNode == null)
                    break;
                previousNode = currentNode;
                currentNode = nextNode;
                nextNode = nextNode.Next;
    
            }
    
            head = currentNode;
    
        }
    
    
        public IEnumerator<T> GetEnumerator()
        {
            Node current = head;
    
            while (current != null)
            {
                yield return current.Data;
                current = current.Next;
            }
        }
    }