public override string ToString() { StringBuilder s = new StringBuilder(); SingleLinkedNode <T> p = head; while (p.Next != null) { s.Append(p.Next); p = p.Next; } return(s.ToString()); }
///<summary>以一个数组的多个元素构造单向链表</summary> public SingleLinkedList(T[] a) : this() { SingleLinkedNode <T> rear, q; rear = head; for (int i = 0; i < a.Length; i++) { q = new SingleLinkedNode <T>(a[i]); rear.Next = q; rear = q; } }
public SingleLinkedList(T[] itemArray) : this()//使用一个数组创建线性表 { SingleLinkedNode <T> rear, q; rear = head;//指向链表尾结点 for (int i = 0; i < itemArray.Length; i++) { q = new SingleLinkedNode <T>(itemArray[i]);//新建一个结点 rear.Next = q; rear = q; } }
public bool Contain(T item) { bool isContain = false; SingleLinkedNode <T> p = head; while ((p.Next != null) && (!isContain))//一旦找到就可以提前退出循环 { isContain = item.Equals(p.Next.Item); p = p.Next; } return(isContain); }
public void add(SingleLinkedList <T> tar, int startOfMe, int startOfTar, int num)//从SingleLinkedList复制并插入元素 { if (tar.getLength == 0) { return; } if (num > tar.getLength - startOfTar) { num = tar.getLength - startOfTar; } int i; tar.repos(startOfTar); if (length == 0) { i = 1; pos = new SingleLinkedNode <T>(tar[0]); tar.repos(1); length++; } else { i = 0; } SingleLinkedNode <T> first = pos; if (startOfMe >= 0) { for (int j = 0; j < startOfMe; j++) { first = first.Next; } } else { for (int j = 0; j > startOfMe; j--) { first = first.Last; } } for (; i < num; i++) { SingleLinkedNode <T> now = new SingleLinkedNode <T>(tar[0], first, first.Next); tar.repos(1); now.Last.Next = now; first = now; length++; } tar.repos(-startOfTar - i); first.Next.Last = first; }
public void add(T[] tar, int startOfMe, int startOfTar, int num)//从数组复制并插入元素 { if (tar.Length == 0) { return; } if (startOfTar < 0) { return; } if (num > tar.Length - startOfTar) { num = tar.Length - startOfTar; } int i; if (length == 0) { i = 1; pos = new SingleLinkedNode <T>(tar[startOfTar]); length++; } else { i = 0; } SingleLinkedNode <T> first = pos; if (startOfMe >= 0) { for (int j = 0; j < startOfMe; j++) { first = first.Next; } } else { for (int j = 0; j > startOfMe; j--) { first = first.Last; } } for (; i < num; i++) { SingleLinkedNode <T> now = new SingleLinkedNode <T>(tar[startOfTar + i], first, first.Next); now.Last.Next = now; first = now; length++; } first.Next.Last = first; }
public T[] ToArray() { T[] array = new T[Count]; SingleLinkedNode <T> p = head; int i = 0; while (p.Next != null) { array[i] = p.Next.Item; p = p.Next; i++; } return(array); }
public void add(T tar)//插入元素 { if (length == 0) { pos = new SingleLinkedNode <T>(tar); length++; return; } SingleLinkedNode <T> first = new SingleLinkedNode <T>(tar, pos.Last, pos); pos.Last.Next = first; pos.Last = first; length++; }
private void reQuickSort(int s, int e) { if (s < e) { int i, j; T x1, x2; i = s; j = e; SingleLinkedNode <T> first = pos; for (int k = 0; k < i; k++) { first = first.Next; } x1 = first.Data; x2 = first.Data; SingleLinkedNode <T> last = pos; for (int k = 0; k < j; k++) { last = last.Next; } while (i < j) { while (i < j && last.Data.CompareTo(x1) < 0) { j--; last = last.Last; } if (i < j) { first.Data = last.Data; i++; first = first.Next; } while (i < j && first.Data.CompareTo(x1) > 0) { i++; first = first.Next; } if (i < j) { last.Data = first.Data; j--; last = last.Last; } } first.Data = x2; reQuickSort(s, i - 1); reQuickSort(i + 1, e); } }
public T Dequeue() { if (Empty) { throw new InvalidOperationException("The queue is empty:" + this.GetType()); } else { T out_item = front.Item; Head.Next = front.Next; front = Head.Next; return(out_item); } }
public void Show() { if (!Empty) { SingleLinkedNode <T> p = head.Next; while (p.Next != head.Next) { p.Show(); Console.Write(" "); p = p.Next; } p.Show(); } }
public T Pop() { if (Empty) { throw new InvalidOperationException("Stack is empty" + this.GetType()); } else { T value = default(T); value = top.Item; top = top.Next; base.Head.Next = top; return(value); } }
public void AddRange(T[] itemArray) { SingleLinkedNode <T> p = head; while (p.Next != null) { p = p.Next; } for (int i = 0; i < itemArray.Length; i++) { SingleLinkedNode <T> new_item = new SingleLinkedNode <T>(itemArray[i]); p.Next = new_item; p = p.Next; } }
public void add(SequencedList <T> tar, int startOfMe, int startOfTar = 0)//从SequencedList复制并插入元素 { if (tar.getLength == 0) { return; } if (startOfTar < 0) { return; } int i; if (length == 0) { i = 1; pos = new SingleLinkedNode <T>(tar[startOfTar]); length++; } else { i = 0; } int num = tar.getLength; SingleLinkedNode <T> first = pos; if (startOfMe >= 0) { for (int j = 0; j < startOfMe; j++) { first = first.Next; } } else { for (int j = 0; j > startOfMe; j--) { first = first.Last; } } for (; i < num; i++) { SingleLinkedNode <T> now = new SingleLinkedNode <T>(tar[startOfTar + i], first, first.Next); now.Last.Next = now; first = now; length++; } first.Next.Last = first; }
public void Remove(T item) { SingleLinkedNode <T> p = head; SingleLinkedNode <T> q = head.Next; while (q.Next != null) { if (item.Equals(q.Item)) { p.Next = q.Next; break; } p = p.Next; q = q.Next; } }
public void Enqueue(T item) { SingleLinkedNode <T> new_item = new SingleLinkedNode <T>(item); if (Empty) { Head.Next = new_item; front = rear = new_item; } else { rear.Next = new_item; rear = rear.Next; front = Head.Next; } }
public int reverseFind(T tar, int start, int end)//从右到左查找元素 { int id = start; SingleLinkedNode <T> s = pos; SingleLinkedNode <T> e = pos; if (start >= 0) { for (int j = 0; j < start; j++) { s = s.Next; } } else { for (int j = 0; j > start; j--) { s = s.Last; } } if (end >= 0) { for (int j = 0; j < start; j++) { e = e.Next; } } else { for (int j = 0; j > start; j--) { e = e.Last; } } while (s != e) { if (s.Data.CompareTo(tar) == 0) { return(id); } s = s.Last; id--; } return(-1); }
public void Add(T item) { SingleLinkedNode <T> new_item = new SingleLinkedNode <T>(item); SingleLinkedNode <T> p = first; if (first == null) { first = new_item; } else { while (p.Next != null) { p = p.Next; } p.Next = new_item; } }
public bool Contain(T item) { if (Empty) { return(false); } else { bool isContain = false; SingleLinkedNode <T> p = head.Next; while ((p.Next != head.Next) && (!isContain))//一旦找到就可以提前退出循环 { isContain = item.Equals(p.Next.Item); p = p.Next; } return(isContain); } }
public void RemoveAt(int index) { if ((index < 0) || (index >= Count)) { throw new IndexOutOfRangeException("Index out of Range!!!"); } else { SingleLinkedNode <T> p = head; SingleLinkedNode <T> q = head.Next; for (int i = 0; i < index; i++) { p = p.Next; q = q.Next; } p.Next = q.Next; } }
public void delete(int start, int num)//删除元素 { if (length == 0) { return; } if (num <= 0) { return; } if (num > length) { num = length; } SingleLinkedNode <T> first = pos; if (start >= 0) { for (int j = 0; j < start; j++) { first = first.Next; } } else { for (int j = 0; j > start; j--) { first = first.Last; } } SingleLinkedNode <T> now = first; for (int i = 0; i < num; i++) { now = now.Next; } now.Last = first.Last; first.Last.Next = now; if (start <= 0 && start + num >= 0) { pos = now; } length -= num; }
public void InsertRange(int index, T[] itemArray) { if ((index < 0) || (index >= Count)) { throw new IndexOutOfRangeException("Index out of range!!!"); } else { if (index == 0) { //保存原来的第一个元素 SingleLinkedNode <T> p = first; first = new SingleLinkedNode <T>(itemArray[0]); //新链表的第一个元素 SingleLinkedNode <T> q = first; for (int i = 1; i < itemArray.Length; i++) { //新的数组有多少个元素就必须新建多少个对象 SingleLinkedNode <T> new_item = new SingleLinkedNode <T>(itemArray[i]); q.Next = new_item; q = q.Next; } q.Next = p; } else { SingleLinkedNode <T> p = first; SingleLinkedNode <T> q = first.Next; for (int i = 1; i < index; i++) { p = p.Next; q = q.Next; } for (int i = 0; i < itemArray.Length; i++) { //新的数组有多少个元素就必须新建多少个对象 SingleLinkedNode <T> new_item = new SingleLinkedNode <T>(itemArray[i]); p.Next = new_item; p = p.Next; } p.Next = q; } } }
public T this[int i]//链表的索引器 { get { SingleLinkedNode <T> first = pos; if (i >= 0) { for (int j = 0; j < i; j++) { first = first.Next; } return(first.Data); } else { for (int j = 0; j > i; j--) { first = first.Last; } return(first.Data); } } set { SingleLinkedNode <T> first = pos; if (i >= 0) { for (int j = 0; j < i; j++) { first = first.Next; } first.Data = value; } else { for (int j = 0; j > i; j--) { first = first.Last; } first.Data = value; } } }
public int IndexOf(T item) { int index = 0; SingleLinkedNode <T> p = head; while (p.Next != null) { if (item.Equals(p.Next.Item))//一旦找到匹配的就立刻退出函数 { return(index); } else { index++; p = p.Next; } } return(-1); }
//索引器 public virtual T this[int i] { get { if ((i < 0) || (i >= Count)) { throw new IndexOutOfRangeException("Index is out of range " + this.GetType()); } else { SingleLinkedNode <T> p = head.Next; while (i > 0) { p = p.Next; i--; } return(p.Item); } } }
public SingleLinkedList(SingleLinkedList <T> tar)//使用SingleLinkedList初始化 { if (tar.getLength == 0) { return; } SingleLinkedNode <T> first; SingleLinkedNode <T> next; first = new SingleLinkedNode <T>(tar[0]); pos = first; length++; for (int i = 1; i < tar.getLength; i++) { next = new SingleLinkedNode <T>(tar[i], first, pos); first.Last = next; first = next; length++; } }
public void Insert(int index, T item) { if ((index < 0) || (index >= Count)) { throw new IndexOutOfRangeException("Index is out of range " + this.GetType()); } else { SingleLinkedNode <T> p = head; SingleLinkedNode <T> q = head.Next; SingleLinkedNode <T> new_item = new SingleLinkedNode <T>(item); for (int i = 0; i < index; i++) { p = p.Next; q = q.Next; } p.Next = new_item; new_item.Next = q; } }
public void Add(T item) { SingleLinkedNode <T> new_item = new SingleLinkedNode <T>(item); if (Empty) { head.Next = new_item; new_item.Next = head.Next; } else { SingleLinkedNode <T> p = head.Next; while (p.Next != head.Next) { p = p.Next; } p.Next = new_item; new_item.Next = head.Next; } }
/// <summary> /// 弹出链式栈栈顶数据元素,栈为空时报异常 /// </summary> public T Pop() { //置变量k为T类型的缺省值 //对于引用类型,将为 NULL;对于值类型,将为零;对于结构,将为 0 位模式 T k = default(T); //栈不空 if (!Empty) { //取得栈顶数据元素值 k = top.Item; top = top.Next; //删除栈顶结点 base.Head.Next = top; return(k); } else { throw new InvalidOperationException("Stack is Empty: " + this.GetType()); } }
public void Remove(T item) { if (item.Equals(this[0]))//移除头结点 { SingleLinkedNode <T> p = head.Next; while (p.Next != head.Next) { p = p.Next; } p.Next = head.Next.Next; head.Next = head.Next.Next; } else if (item.Equals(this[Count - 1]))//移除尾结点 { SingleLinkedNode <T> p = head; SingleLinkedNode <T> q = head.Next; while (q.Next != head.Next) { p = p.Next; q = q.Next; } p.Next = head.Next; } else//移除中间结点 { SingleLinkedNode <T> p = head; SingleLinkedNode <T> q = head.Next; while (q.Next != head.Next) { if (item.Equals(q.Item)) { p.Next = q.Next; break; } p = p.Next; q = q.Next; } } }