public virtual int Add(object value) { if (internalhead == null) { internalhead = new LinkNode(value); internaltail = internalhead; } else { // Added this code because internaltail seems to be null in come cases if (internaltail == null) { internaltail = internalhead; while(internaltail.Next != null) internaltail = internaltail.Next; } internaltail.Next = new LinkNode(value, null, internaltail); internaltail = internaltail.Next; } return internalcount++; }
public virtual void AddFirst(object value) { if (internalhead == null) { internalhead = new LinkNode(value); } else { internalhead = new LinkNode(value, internalhead, null); } internalcount++; }
public virtual int AddLast(object value) { if (internalhead == null) { internalhead = new LinkNode(value); } else { LinkNode p, q; for(p = internalhead; (q = p.Next) != null; p = q) ; p.Next = new LinkNode(value, null, p); } return internalcount++; }
public void Reset() { _current = internalhead; _isFirst = true; }
public bool MoveNext() { if (_current == null) return false; if (!_isFirst) { _current = _current.Next; } else { _isFirst = false; } return _current != null; }
public LinkNode(object value, LinkNode next, LinkNode prev) { _value = value; _next = next; _prev = prev; }
public LinkedListEnumerator(LinkNode node) { internalhead = node; Reset(); }
public virtual void Remove(object value) { if (internalhead != null) { if (internalhead.Value.Equals(value)) { if (internalhead == internaltail) internaltail = null; internalhead = internalhead.Next; internalcount--; } else if (internaltail.Value.Equals(value)) { internaltail.Previous.Next = null; internaltail = internaltail.Previous; internalcount--; } else { LinkNode node = internalhead.Next; while(node != null) { if (node.Value.Equals(value)) { node.Previous.Next = node.Next; node.Next.Previous = node.Previous; internalcount--; break; } node = node.Next; } } } }
public virtual void Insert(int index, object value) { if (index == 0) { AddFirst(value); } else if (index == internalcount) { AddLast(value); } else { LinkNode insert = GetNode(index); LinkNode node = new LinkNode(value, insert, insert.Previous); insert.Previous.Next = node; insert.Previous = node; internalcount++; } }
public void Clear() { internalhead = internaltail = null; internalcount = 0; }
public bool MoveNext() { if (current == null) return false; if (!isFirst) { current = current.Next; } else { isFirst = false; } return current != null; }
public LinkNode(object value, LinkNode next, LinkNode previous) { this.value = value; this.next = next; this.previous = previous; }