Ejemplo n.º 1
0
        /// <summary>
        /// 返回单链表的长度
        /// </summary>
        /// <returns></returns>
        public int Count()
        {
            DbNode <T> p   = head;
            int        len = 0;

            while (p != null)
            {
                len++;
                p = p.Next;
            }
            return(len);
        }
Ejemplo n.º 2
0
        public override string ToString()
        {
            StringBuilder sb = new StringBuilder();
            DbNode <T>    n  = this.head;

            sb.Append(n.Data.ToString() + ",");
            while (n.Next != null)
            {
                sb.Append(n.Next.Data.ToString() + ",");
                n = n.Next;
            }
            return(sb.ToString().TrimEnd(','));
        }
Ejemplo n.º 3
0
        /// <summary>
        /// 测试用prev属性从后面开始遍历
        /// </summary>
        /// <returns></returns>
        public string TestPrevErgodic()
        {
            DbNode <T>    tail = GetNodeAt(Count() - 1);
            StringBuilder sb   = new StringBuilder();

            sb.Append(tail.Data.ToString() + ",");
            while (tail.Prev != null)
            {
                sb.Append(tail.Prev.Data.ToString() + ",");
                tail = tail.Prev;
            }
            return(sb.ToString().TrimEnd(','));
        }
Ejemplo n.º 4
0
        //前插
        public void InsertBefore(T item, int i)
        {
            if (IsEmpty() || i < 0)
            {
                Console.WriteLine("List is empty or Position is error!");
                return;
            }

            //在最开头插入
            if (i == 0)
            {
                DbNode <T> q = new DbNode <T>(item);
                q.Next    = head; //把"头"改成第二个元素
                head.Prev = q;
                head      = q;    //把自己设置为"头"
                return;
            }

            DbNode <T> n = head;
            DbNode <T> d = new DbNode <T>();
            int        j = 0;

            //找到位置i的前一个元素d
            while (n.Next != null && j < i)
            {
                d = n;
                n = n.Next;
                j++;
            }

            if (n.Next == null) //说明是在最后节点插入(即追加)
            {
                DbNode <T> q = new DbNode <T>(item);
                n.Next = q;
                q.Prev = n;
                q.Next = null;
            }
            else
            {
                if (j == i)
                {
                    DbNode <T> q = new DbNode <T>(item);
                    d.Next = q;
                    q.Prev = d;
                    q.Next = n;
                    n.Prev = q;
                }
            }
        }
Ejemplo n.º 5
0
        /// <summary>
        /// 元素反转
        /// </summary>
        public void Reverse()
        {
            DbLinkList <T> result = new DbLinkList <T>();
            DbNode <T>     t      = this.head;

            result.Head = new DbNode <T>(t.Data);
            t           = t.Next;

            //(把当前链接的元素从head开始遍历,逐个插入到另一个空链表中,这样得到的新链表正好元素顺序跟原链表是相反的)
            while (t != null)
            {
                result.InsertBefore(t.Data, 0);
                t = t.Next;
            }
            this.head = result.head; //将原链表直接挂到"反转后的链表"上
            result    = null;        //显式清空原链表的引用,以便让GC能直接回收
        }
Ejemplo n.º 6
0
        /// <summary>
        /// 在最后附加元素
        /// </summary>
        /// <param name="item"></param>
        public void Append(T item)
        {
            DbNode <T> d = new DbNode <T>(item);
            DbNode <T> n = new DbNode <T>();

            if (head == null)
            {
                head = d;
                return;
            }

            n = head;
            while (n.Next != null)
            {
                n = n.Next;
            }
            n.Next = d;
            d.Prev = n;
        }
Ejemplo n.º 7
0
        //按元素值查找索引
        public int IndexOf(T value)
        {
            if (IsEmpty())
            {
                Console.WriteLine("List is Empty!");
                return(-1);
            }
            DbNode <T> p = new DbNode <T>();

            p = head;
            int i = 0;

            while (!p.Data.Equals(value) && p.Next != null)
            {
                p = p.Next;
                i++;
            }
            return(i);
        }
Ejemplo n.º 8
0
        /// <summary>
        /// 在位置i后插入元素item
        /// </summary>
        /// <param name="item"></param>
        /// <param name="i"></param>
        public void InsertAfter(T item, int i)
        {
            if (IsEmpty() || i < 0)
            {
                Console.WriteLine("List is empty or Position is error!");
                return;
            }

            if (i == 0)
            {
                DbNode <T> q = new DbNode <T>(item);
                q.Next         = head.Next;
                head.Next.Prev = q;
                head.Next      = q;
                q.Prev         = head;
                return;
            }

            DbNode <T> p = head;
            int        j = 0;

            while (p != null && j < i)
            {
                p = p.Next;
                j++;
            }
            if (j == i)
            {
                DbNode <T> q = new DbNode <T>(item);
                q.Next = p.Next;
                if (p.Next != null)
                {
                    p.Next.Prev = q;
                }
                p.Next = q;
                q.Prev = p;
            }
            else
            {
                Console.WriteLine("Position is error!");
            }
        }
Ejemplo n.º 9
0
        /// <summary>
        /// 删除位置i的元素
        /// </summary>
        /// <param name="i"></param>
        /// <returns></returns>
        public T RemoveAt(int i)
        {
            if (IsEmpty() || i < 0)
            {
                Console.WriteLine("Link is empty or Position is error!");
                return(default(T));
            }

            DbNode <T> q = new DbNode <T>();

            if (i == 0)
            {
                q         = head;
                head      = head.Next;
                head.Prev = null;
                return(q.Data);
            }

            DbNode <T> p = head;
            int        j = 0;

            while (p.Next != null && j < i)
            {
                j++;
                q = p;
                p = p.Next;
            }

            if (j == i)
            {
                p.Next.Prev = q;
                q.Next      = p.Next;
                return(p.Data);
            }
            else
            {
                Console.WriteLine("The node is not exist!");
                return(default(T));
            }
        }
Ejemplo n.º 10
0
 /// <summary>
 /// 清空
 /// </summary>
 public void Clear()
 {
     head = null;
 }
Ejemplo n.º 11
0
 public DbLinkList()
 {
     head = null;
 }
Ejemplo n.º 12
0
 public DbNode()
 {
     data = default(T);
     next = null;
     prev = null;
 }
Ejemplo n.º 13
0
 public DbNode(T data)
 {
     this.data = data;
     this.next = null;
     this.prev = null;
 }
Ejemplo n.º 14
0
 public DbNode(DbNode <T> next)
 {
     this.data = default(T);
     this.next = next;
     this.prev = null;
 }
Ejemplo n.º 15
0
 public DbNode(T data, DbNode <T> next)
 {
     this.data = data;
     this.next = next;
     this.prev = null;
 }
Ejemplo n.º 16
0
 public DbNode(T data, DbNode <T> next, DbNode <T> prev)
 {
     this.data = data;
     this.next = next;
     this.prev = prev;
 }