节点
class Node<T>
{
private T data; //数据域
private Node<T> next; //引用域
//数据域属性
public T Data
{
get => data;
set => data = value;
}
//引用域属性
internal Node<T> Next
{
get => next;
set => next = value;
}
//构造器
public Node(T val, Node<T> p)
{
Data = val;
Next = p;
}
//构造器
public Node(Node<T> p)
{
Next = p;
}
//构造器
public Node(T val)
{
Data = val;
}
//构造器
public Node()
{
Data = default(T);
Next = null;
}
}
接口
public interface IListDs<T>
{
int GetLength(); //求长度
void Clear(); //清空操作
bool IsEmpty(); //判断线性表是否为空
void Append(T item); //附加操作
void Insert(T item, int i); //插入操作
T Delete(int i); //删除操作
T GetElem(int i); //取表元
int Locate(T value); //按值查找
}
实现
using System;
class LinkList<T> : IListDs<T>
{
private Node<T> head; //单链表的头引用
//头引用的属性
internal Node<T> Head
{
get => head;
set => head = value;
}
//构造器
public LinkList()
{
head = null;
}
//在链表末尾添加元素
public void Append(T item)
{
Node<T> q = new Node<T>(item);
Node<T> p = new Node<T>();
//头节点为空时直接修改头节点的引用
if (head == null)
{
head = q;
return;
}
p = head;
//遍历至最后一个节点
while (p.Next != null)
{
p = p.Next;
}
//将新元素挂载到末尾
p.Next = q;
}
//清空链表
public void Clear()
{
head = null;
}
//删除节点
public T Delete(int i)
{
if (IsEmpty() || i < 1)
{
Console.WriteLine("链表为空或位置错误");
return default(T);
}
Node<T> q = new Node<T>();
//删除头节点
if (i == 1)
{
q = head;
head = head.Next;
return q.Data;
}
//遍历删除节点
Node<T> p = head;
int j = 1;
while (p.Next != null && j < i)
{
q = p;
p = p.Next;
++j;
}
if (j == i)
{
q.Next = p.Next;
return p.Data;
}
else
{
Console.WriteLine("位置不正确");
return default(T);
}
}
//取第i个元素
public T GetElem(int i)
{
if (IsEmpty())
{
Console.WriteLine("链表为空");
return default(T);
}
Node<T> p = new Node<T>();
p = head;
int j = 1;
while (p.Next != null && j < i)
{
p = p.Next;
++j;
}
if (j == i)
{
return p.Data;
}
else
{
Console.WriteLine("位置不正确!");
}
return default(T);
}
//求链表的长度
public int GetLength()
{
Node<T> p = head;
int len = 0;
while (p != null)
{
p = p.Next;
++len;
}
return len;
}
//插入节点
public void Insert(T item, int i)
{
//插入位置小于1或链表为空时,不能插入
if (IsEmpty() || i < 1)
{
Console.WriteLine("链表为空或位置错误");
return;
}
//插入位置为1时,直接在头节点后添加。
if (i == 1)
{
Node<T> q = new Node<T>(item);
q.Next = head.Next;
head.Next = q;
return;
}
//先遍历位置,再插入
int j = 1;
Node<T> p = head;
Node<T> r = new Node<T>();
while (p.Next != null && j < i)
{
r = p;
p = p.Next;
++j;
}
if (j == i)
{
Node<T> q = new Node<T>(item);
Node<T> m = r.Next;
r.Next = q;
q.Next = m;
}
}
//判断是否为空
public bool IsEmpty()
{
return head == null;
}
//在单链表中查找值为value的节点
public int Locate(T value)
{
if (IsEmpty())
{
Console.WriteLine("链表为空!");
return -1;
}
Node<T> p = new Node<T>();
p = head;
int i = 1;
while ((p.Next != null) && (!p.Data.Equals(value)))
{
p = p.Next;
++i;
}
if (p == null)
{
Console.WriteLine("不存在这样的节点");
return -1;
}
else
{
return i;
}
}
}
来源:CSDN
作者:繁星娱乐
链接:https://blog.csdn.net/qq_26343241/article/details/103243692