/// <summary> /// 返回单链表的长度 /// </summary> /// <returns></returns> public int Count() { DbNode <T> p = head; int len = 0; while (p != null) { len++; p = p.Next; } return(len); }
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(',')); }
/// <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(',')); }
//前插 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; } } }
/// <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能直接回收 }
/// <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; }
//按元素值查找索引 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); }
/// <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!"); } }
/// <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)); } }
/// <summary> /// 清空 /// </summary> public void Clear() { head = null; }
public DbLinkList() { head = null; }
public DbNode() { data = default(T); next = null; prev = null; }
public DbNode(T data) { this.data = data; this.next = null; this.prev = null; }
public DbNode(DbNode <T> next) { this.data = default(T); this.next = next; this.prev = null; }
public DbNode(T data, DbNode <T> next) { this.data = data; this.next = next; this.prev = null; }
public DbNode(T data, DbNode <T> next, DbNode <T> prev) { this.data = data; this.next = next; this.prev = prev; }