您的位置:首页 > 职场人生

面试-双向链表

2016-11-03 14:27 239 查看
面试遇到一个题目,写一个双向链表,包括添加,删除,查找和遍历。当时写了一塌糊涂,后来自己都觉得想笑,双向写着写着被我写成了单向不像单向,双向不像双向了,真是不伦不类。之后 我把这个问题整理了一下,希望对以后的小伙伴 有帮助。如果有错误,希望指出 以免误人。谢谢!

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();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: