接口:(同顺序表中的接口)
单链表定义:
//在单链表的末尾添加新元素
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!=null)
{
p=p.Next;
}
p.Next=q;
}
//在单链表的第i个结点的位置 前 出入一个值为item的结点
public void Insert(T item,int i)
{
Node<T> q=new Node<T>(item);
Node<T> p=new Node<T>();
if(IsEmpty()||i<1)
{
Console.WriteLine("LinkList is empty or Position is error");
return;
}
//插入在链表的头节点处
if(i==1)
{
q.Next=head;
head=q;
return;
}
p=head;
int j=1;
Node<T> r=new Node<T>();
while(p.Next!=null&&j<i)
{
r=p;
p=p.Next;
++j;
}
if(j==i)
{
q.Next=p;
r.Next=q;
}
}
//在单链表的第i个结点的位置 后 插入一个值为item的结点
public void InsertPost(T item,int i)
{
if(IsEmpty()||i<1)
{
Console.WriteLine("LinkList is empty or Position is error");
return;
}
Node<T> q=new Node<T>(item);
Node<T> p=new Node<T>();
int j=1;
p=head;
while(p!=null&&j<i)
{
p=p.Next;
j++;
}
if(j==i)
{
q.Next=p.Next;
p.Next=q;
}
}
//删除单链表的第i个结点
public T Delete(int i)
{
if(IsEmpty()||i<1)
{
Console.WriteLine("Link is empty or Position is error.");
return default(T);
}
Node<T> q=new Node<T>();
if(i==1)
{
q=head;
head=head.Next;
return q.Data;
}
Node<T> p=new 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("The ith node is not exist!");
return default(T);
}
}
//获得单链表的第i个数据元素
public T GetElem(int i)
{
if(IsEmpty())
{
Console.WriteLine("List is empty!");
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("The ith mode is not exist!");
return default(T);
}
}
//在单链表中查找值为value的结点
public int Locate(T value)
{
if(IsEmpty())
{
Console.WriteLine("List is empty!");
}
Node<T> p=new Node<T>();
p=head;
int j=1;
while(!p.Data.Equals(value)&&p.Next!=null)
{
p=p.Next;
j++;
}
return j;
}
//单链表倒置
public void Reverse()
{
Node<T> p=head.Next;
Node<T> q=new Node<T>();
head.Next=null;
while(p!=null)
{
q=p;
p=p.Next;
q.Next=head.Next;//考虑插入操作
head.Next=q;
}
}
}
应用实例
//用-1作为输入数据的结束标志
while(d!=-1)
{
Node<int> p=new Node<int>(d);
p.Next=L.Head;
L.Head=p;
d=Int32.Parse(Console.ReadLine());
}
return L;
}
//在单链表的尾部插入结点 建立 单链表
LinkList<int> CreateListTail()
{
LinkList<int> L=new LinkList<int>();
Node<int> p=new Node<int>();
p=L.Head;
int d=Int32.Parse(Console.ReadLine());
while(d!=-1)
{
Node<int> q=new Node<int>(d);
if(p==null)
{
L.Head=q;
}
else
{
p.Next=q;
}
p=q;
d=Int32.Parse(Console.ReadLine());
}
if(p!=null)
{
p.Next=null;
}
return L;
}
//将两表合并成一表
public LinkList<int> Merge(LinkList<int> Ha,LinkList<int>Hb)
{
LinkList<int> Lc=new LinkList<int>();
Node<int> p=Ha.Next;
Node<int> q=Hb.Next;
Node<int> s=Node<int>();
Lc=Ha;
Lc.Next=null;
while(p!=null&&q!=null)
{
if(p.Data<q.Data)
{
s=p;
p=p.Next;
}
else
{
s=q;
q=q.Next;
}
Lc.Append(s);
}
if(p==null)
{
p=q;
}
while(p!=null)
{
s=p;
p=p.Next;
Lc.Append(s);
}
return Lc;
}
//把结点插入到链表Hc头部合并Ha和Hb的算法
public LinkList<int> Merge(LinkList<int> Ha,LinkList<int> Hb)
{
LinkList<int> Hc=new LinkList<int>();
Node<int> p=Ha.Next;
Node<int> q=Hb.Next;
Node<int> s=Node<int>();
Hc=Ha;
Hc.Next=null;
while(p!=null&&q!=null)
{
if(p.Data<q.Data)
{
s=p;
p=p.Next;
}
else
{
s=q;
q=q.Next;
}
s.Next=Hc.Next;
Hc.Next=s;
}
if(p==null)
{
p=q;
}
while(p!=null)
{
s=p;
p=p.Next;
s.Next=Hc.Next;
Hc.Next=s;
}
return Hc;
}
//已知一个存储整数的单链表Ha,试构造单链表Hb,要求单链表Hb中只包含
//单链表Ha中所有值不相同的结点
public LinkList<int> Purge(LinkList<int> Ha)
{
LinkList<int> Hb=new LinkList<int>();
Node<int> p=Ha.Next;
Node<int> q=new Node<int>();
Node<int> s=new Node<int>();
//将Ha的第一个元素作为Hb的第一个元素
s=p;
p=p.Next;
s.Next=null;
Hb.Next=s;
while(p!=null)
{
s=p;
p=p.Next;
q=Hb.Next;
while(q!=null&&q.Data!=s.Data)
{
q=q.Next;
}
if(q==null)
{
//插入元素结点
s.Next=Hb.Next;
Hb.Next=s;
}
}
}