用C#实现单向链表
2010-02-27 13:32
399 查看
节点类:
链表类:
public class Node<T> { /// <summary> /// 数据 /// </summary> public T NodeData { get; set; } /// <summary> /// 指向下一个节点 /// </summary> public Node<T> Next { get; set; } }
链表类:
public class SingleList<T> { private Node<T> _first;//头节点 private Node<T> _last;//尾节点 private int _length;//链表长度 /// <summary> /// 头节点 /// </summary> public T First { get { return _first.NodeData; } } /// <summary> /// 尾节点 /// </summary> public T Last { get{ return _last.NodeData; } } /// <summary> /// 链表长度 /// </summary> public int Length { get { return _length; } } /// <summary> /// 链表是否为空 /// </summary> public bool IsEmpty { get { return _first == null; } } /// <summary> /// 清空链表 /// </summary> public void Clear() { _first = null; } /// <summary> /// 追加一个节点 /// </summary> /// <param name="item"></param> public void Append(T item) { Node<T> newNode = new Node<T>(); newNode.NodeData = item; if (_first == null) { _first = _last = newNode; } else { _last.Next = newNode; _last = newNode; } _length++; } /// <summary> /// 在指定位置插入节点 /// </summary> /// <param name="item"></param> /// <param name="location"></param> public void Insert(T item, int location) { Node<T> tempNodePre;//前一个节点 Node<T> tempNodeNex;//后一个节点 Node<T> newNode = new Node<T>();//待插入新节点 newNode.NodeData = item; if (this.IsEmpty)//链表为空:不能进行插入操作 { throw new Exception("链表为空"); } if (location == 0)//在链表头插入 { tempNodeNex = _first; _first = newNode; newNode.Next = tempNodeNex; _length++; return; } if (location == _length - 1)//在链表尾插入 { _last.Next = newNode; _last = newNode; _length++; return; } //*********其它位置***********************// tempNodePre = this.FindNode(location - 1); if (tempNodePre == null) { throw new Exception("位置无效"); } tempNodeNex = tempNodePre.Next; tempNodePre.Next = newNode; newNode.Next = tempNodeNex; _length++; } /// <summary> /// 删除指定位置的节点 /// </summary> /// <param name="location"></param> /// <returns>删除的数据</returns> public T Delete(int location) { T deleteData; Node<T> tempNodeDel;//待删除节点 Node<T> tempNodePre;//前一个节点 Node<T> tempNodeNex;//后一个节点 if (this.IsEmpty) { throw new Exception("链表为空,不能删除节点"); } if (location == 0)//删除头节点 { deleteData = _first.NodeData; _first = _first.Next; _length--; return deleteData; } if (location == _length - 1)//删除尾节点 { tempNodeDel = _last; _last = this.FindNode(location - 1); _last.Next = null; _length--; return tempNodeDel.NodeData; } //*********其它位置***********************// tempNodePre = this.FindNode(location - 1); if (tempNodePre == null) { throw new Exception("无效位置"); } tempNodeDel = tempNodePre.Next; tempNodeNex = tempNodeDel.Next; tempNodePre.Next = tempNodeNex; _length--; return tempNodeDel.NodeData; } /// <summary> /// 根据索引查找值 /// </summary> /// <param name="index"></param> /// <returns></returns> public T Find(int index) { if (this.IsEmpty) { throw new Exception("链表为空"); } Node<T> find = this.FindNode(index); if (find == null) { return default(T); } return this.FindNode(index).NodeData; } /// <summary> /// 根据索引查找值 /// </summary> /// <param name="item"></param> /// <returns>没有找到时返回-1</returns> public int Find(T item) { if (this.IsEmpty) { throw new Exception("链表为空"); } int index = 0; int result=-1; Node<T> temp = _first; while (index < _length) { if (temp.NodeData.Equals(item)) { result = index; break; } temp = temp.Next; index++; } return result; } /// <summary> /// 翻转链表 /// </summary> public void Reverses() { if (this.IsEmpty) { return; } Node<T> temp = _first.Next; Node<T> nextNode; Node<T> currentNode = _first; while (temp != null) { nextNode = temp.Next; temp.Next = currentNode; currentNode = temp; temp = nextNode; } Node<T> tempFirst = _first; _first = _last; _last = tempFirst; } /// <summary> /// 根据索引找到节点 /// </summary> /// <param name="index"></param> /// <returns></returns> private Node<T> FindNode(int index) { if (index < 0 || index >= _length) { return null; } int i = 0; Node<T> tempNode = _first; while (i < index) { tempNode = tempNode.Next; i++; } return tempNode; } }
相关文章推荐
- C#单向链表的实现
- C#单向链表的实现
- C# 实现一个单向链表
- C#实现单向链表
- C++中单向链表的实现(类似C#)
- C#实现单向链表
- 线性表的链式存储结构_单向链表[带头结点]_C#实现
- 转贴-- 单向链表的实现 C# http://blog.csdn.net/a497785609/archive/2009/09/29/4617692.aspx
- 数据结构:单向链表的C语言实现
- 链式栈(单向链表实现)
- java单向循环链表实现约瑟夫环
- C递归实现单向链表的反转
- 数据结构之单向链表实现
- 数据结构之单向链表的实现【C++】
- c语言单向链表的基本功能的实现
- 单向链表之创建添加(C语言实现)
- C语言实现单向链表
- c++实现单向链表
- C递归实现单向链表的反转
- C语言实现单向链表及其各种排序(含快排,选择,插入,冒泡)