数据结构|-用C#实现一个简单的链表
我们知道C#中是没有链表的,我们可以自己实现一个
整个单链表能实现的功能有:
功能 | 方法 | 返回值 | 备注 |
获取链表长度 | GetLength() | int | 返回值是链表长度 |
清空链表 | Clear() | void | |
判断链表是否为空 | IsEmpty() | bool | |
添加元素 | Add(T item) | void | 在链表尾添加元素 |
在指定位置插入元素 | Insert(T item,int index) | void | 插入的元素就是第index位 |
删除指定位置元素 | Delete(int index) | T | |
索引器 | this[int index] | T | 类似数组的索引器 |
获取指定位置的值 | GetEle(int index) | T | 以位取值 |
获取值所在的位置 | Locate(T value) | int | 以值取位 |
首先是结点类Node.CS
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _001_线性表 { /// <summary> /// 单链表的结点 /// </summary> /// <typeparam name="T"></typeparam> class Node<T> { private T data;//存储数据 private Node<T> next;//指针 用来指向下一个元素 public Node() { data = default(T); next = null; } public Node(T value) { data = value; next = null; } public Node(T value, Node<T> next) { this.data = value; this.next = next; } public Node(Node<T> next) { this.next = next; } public T Data { get { return data; } set { data = value; } } public Node<T> Next { get { return next; } set { next = value; } } } }
然后是链表的具体功能的实现LinkList
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; namespace _001_线性表 { class LinkList<T> { private Node<T> head;//存储一个头结点 public LinkList() { head = null; } public int GetLength() { if (head == null) return 0; Node<T> temp = head; int count = 1; while (true) { if (temp.Next != null) { count++; temp = temp.Next; } else { break; } } return count; } public void Clear() { head = null; } public bool IsEmpty() { return head == null; } public void Add(T item) { Node<T> newNode = new Node<T>(item);//根据新的数据创建一个新的节点 //如果头结点为空,那么这个新的节点就是头节点 if (head == null) { head = newNode; } else {//把新来的结点放到 链表的尾部 //要访问到链表的尾结点 Node<T> temp = head; while (true) { if (temp.Next != null) { temp = temp.Next; } else { break; } } temp.Next = newNode;//把新来的结点放到 链表的尾部 } } public void Insert(T item, int index) { Node<T> newNode = new Node<T>(item); if (index == 0) //插入到头节点 { newNode.Next = head; head = newNode; } else { Node<T> temp = head; for (int i = 1; i <=index-1; i++) { //让temp向后移动一个位置 temp = temp.Next; } Node<T> preNode = temp; Node<T> currentNode = temp.Next; preNode.Next = newNode; newNode.Next = currentNode; } } public T Delete(int index) { T data = default(T); if (index == 0) //删除头结点 { data = head.Data; head = head.Next; } else { Node<T> temp = head; for (int i = 1; i <= index - 1; i++) { //让temp向后移动一个位置 temp = temp.Next; } Node<T> preNode = temp; Node<T> currentNode = temp.Next; data = currentNode.Data; Node<T> nextNode = temp.Next.Next; preNode.Next = nextNode; } return data; } public T this[int index] { get { Node<T> temp = head; for (int i = 1; i <= index; i++) { //让temp向后移动一个位置 temp = temp.Next; } return temp.Data; } } public T GetEle(int index) { return this[index]; } public int Locate(T value) { Node<T> temp = head; if (temp == null) { return -1; } else { int index = 0; while (true) { if (temp.Data.Equals(value)) { return index; } else { if (temp.Next != null) { temp = temp.Next; } else { break; } } } return -1; } } } }