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