面试-双向链表

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

   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();
        }
原文地址:https://www.cnblogs.com/startlearn/p/6026471.html