面试遇到一个题目,写一个双向链表,包括添加,删除,查找和遍历。当时写了一塌糊涂,后来自己都觉得想笑,双向写着写着被我写成了单向不像单向,双向不像双向了,真是不伦不类。之后 我把这个问题整理了一下,希望对以后的小伙伴 有帮助。如果有错误,希望指出 以免误人。谢谢!
public class LinkNode
{
public LinkNode prev = null;
public LinkNode next = null;
//随便定义的节点数据
public int Data = 0;
public delegate void DataEach(LinkNode data);
public LinkNode(int obj)
{
this.prev = this;
this.next = this;
this.Data = obj;
}
public void Add(LinkNode node)
{
#region 这是加在当前节点后面
var nextNode = this.next;//当前链表 当前节点的下一个节点
var addlastNode = node.prev;//添加的链表的最后一个节点
//当前链表 当前节点的下一个节点 改为添加的节点
this.next = node;
node.prev = this;
//添加列表的最后一个节点的 下一个节点改为当前链表的当前节点的下一节点
addlastNode.next = nextNode;
nextNode.prev = addlastNode;
#endregion
}
public LinkNode Remove(LinkNode node)
{
LinkNode removeNode = FindNode(node);
if (removeNode != null)
{
//不是单节点双向链表
if (removeNode.next != removeNode.prev)
{
removeNode.prev.next = removeNode.next;
removeNode.next.prev = removeNode.prev;
LinkNode returnNode = this;
if (removeNode == this)
{
returnNode = this.prev;
}
GC.Collect();
return returnNode;
}
else
{
return this;
}
}
else
{
return this;
}
}
public LinkNode FindNode(LinkNode data)
{
if (this == data) return this;
LinkNode currentData = this.next;
while (currentData != this)
{
if (currentData == data) return currentData;
else currentData = currentData.next;
}
return null;
}
public void Each(DataEach ea)
{
Console.WriteLine(this.Data);
LinkNode currentData = this.next;
while (currentData != this)
{
if (ea != null)
ea(currentData);
currentData = currentData.next;
}
}
}
测试时Main方法如下:
static void Main(string[] args) { LinkNode node1 = new LinkNode(1); LinkNode node2 = new LinkNode(2); LinkNode node10 = new LinkNode(10); LinkNode node11 = new LinkNode(11); node1.Add(node2); //添加节点 node1.Each(u => { Console.WriteLine(u.Data); }); //遍历 node10.Add(node11); node1.Add(node10); //添加一个双向链表 node1.Each(u => { Console.WriteLine(u.Data); }); //遍历 LinkNode findnode = node1.FindNode(node2); //查询节点 if(findnode!=null) { Console.WriteLine(findnode.Data); } node1.Remove(node2); //删除 node1.Each(u => { Console.WriteLine(u.Data); }); //遍历 Console.ReadLine(); }