链表接口类
定义部分方法体,继承类进行实现,方便扩展。
/** 链表接口 */
public interface ILinkList<T>
{
int GetLength();
void Clear();
bool IsEmpty();
void Append(T item);
void Insert(T item, int i);
void InsertPort(T item, int i);
T Delete(int i);
T GetWithIndex(int i);
int GetWithValue(T value);
void ReverseNoHead();
void ReverseWithHead();
}
节点类
节点组成:当前数据域以及下一节点的引用
/** 节点类 */
public class LinkNode<T>
{
private T data;
public T Data
{
get => data;
set => data = value;
}
private LinkNode<T> nextNode;
public LinkNode<T> NextData
{
get => nextNode;
set => nextNode = value;
}
public LinkNode(T data, LinkNode<T> next = null)
{
this.data = data;
nextNode = next;
}
public LinkNode()
{
this.data = default;
nextNode = null;
}
}
链表类
/** 链表类 */
public class LinkList<T> : ILinkList<T>
{
private LinkNode<T> head;
public LinkNode<T> Head
{
get => head;
set => head = value;
}
public LinkList()
{
head = null;
}
/** 链表长度*/
public int GetLength()
{
int lengthLink = 0;
LinkNode<T> node = head;
while (node != null)
{
lengthLink++;
node = node.NextData;
}
return lengthLink;
}
/** 清空链表*/
public void Clear()
{
head = null;
}
/** 链表判空*/
public bool IsEmpty()
{
return head == null;
}
/** 链表末尾添加元素*/
public void Append(T item)
{
LinkNode<T> newItem = new LinkNode<T>(item);
LinkNode<T> temp = new LinkNode<T>();
if(head == null)
{
head = newItem;
return;
}
temp = head;
while (temp.NextData != null)
{
temp = temp.NextData;
}
temp.NextData = newItem;
}
/** 指定位置添加元素*/
public void Insert(T item, int i)
{
if (IsEmpty() || i <= 0 || GetLength() < i) return;
LinkNode<T> node = null;
if (i == 1)
{
node = new LinkNode<T>(item);
node.NextData = head;
head = node;
return;
}
node = head;
LinkNode<T> temp = new LinkNode<T>();
int j = 1;
while (node.NextData != null && j < i)
{
temp = node;// i-1处的节点
node = node.NextData;// 原i处的节点
j++;
}
if (j == i)
{
LinkNode<T> newNode = new LinkNode<T>(item);
newNode.NextData = node;
temp.NextData = newNode;
}
}
/** 指定位置的后一位添加元素*/
public void InsertPort(T item, int i)
{
if (IsEmpty() || i <= 0 || GetLength() < i) return;
LinkNode<T> node = null;
if (i == 1)
{
node = new LinkNode<T>(item);
node.NextData = head.NextData;
head.NextData = node;
return;
}
node = head;
LinkNode<T> temp = new LinkNode<T>();
int j = 1;
while (j <= i && node.NextData != null)
{
temp = node;
node = node.NextData;
j++;
}
if(j == i + 1)
{
LinkNode<T> add = new LinkNode<T>(item);
add.NextData = node;
temp.NextData = add;
}
}
/** 删除指定位置元素*/
public T Delete(int i)
{
if (IsEmpty() || i <= 0 || GetLength() < i) return default(T);
LinkNode<T> node = new LinkNode<T>();
if (i == 1)
{
node = head;
head = head.NextData;
return node.Data;
}
LinkNode<T> targetNode = head;
int j = 1;
while (targetNode.NextData != null && j < i)
{
node = targetNode;
targetNode = targetNode.NextData;
j++;
}
if (j == i)
{
node.NextData = targetNode.NextData;
return targetNode.Data;
}
return default(T);
}
/** 获取指定位置元素数据*/
public T GetWithIndex(int i)
{
if (IsEmpty() || i <= 0 || GetLength() < i) return default(T);
LinkNode<T> targetNode = head;
int j = 1;
while (targetNode.NextData != null && j < i)
{
targetNode = targetNode.NextData;
j++;
}
if (j == i)
{
return targetNode.Data;
}
return default(T);
}
/** 根据值获取指定元素数据*/
public int GetWithValue(T value)
{
if (IsEmpty()) return -1;
LinkNode<T> targetNode = head;
int j = 1;
while (targetNode != null && !targetNode.Data.Equals(value))
{
targetNode = targetNode.NextData;
j++;
}
if (targetNode!=null)
{
return j;
}
return -1;
}
/** 链表倒置 原头节点为新链表头节点*/
public void ReverseNoHead()
{
LinkNode<T> p = head.NextData;
LinkNode<T> q = new LinkNode<T>();
head.NextData = null;
while (p != null)
{
q = p;
p = p.NextData;
q.NextData = head.NextData;
head.NextData = q;
}
}
/** 链表倒置 原头节点为新链表尾节点*/
public void ReverseWithHead()
{
LinkNode<T> temp1 = null;
LinkNode<T> temp2 = null;
while (head != null)
{
temp2 = head.NextData;
head.NextData = temp1;
temp1 = head;
head = temp2;
}
head = temp1;
}
}