zoukankan      html  css  js  c++  java
  • 面试-双向链表

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

       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();
            }
  • 相关阅读:
    SpringMVC_04重定向和转发
    Spring事务声明
    SpringMVC_02_RequestMapping
    SpringMVC_01_初识
    Spring通过mybatis操作数据库
    SpringMVC_03_RestFul
    SpringMVC_05_json数据传输
    退役
    2017ICPC青岛 J.Suffix
    版本不兼容问题(未找到程序集)
  • 原文地址:https://www.cnblogs.com/startlearn/p/6026471.html
Copyright © 2011-2022 走看看