• 面试-双向链表


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

       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();
            }
  • 相关阅读:
    dotnetCore增加MiddleWare的Run,Use Map MapThen四个扩展方法
    人脸识别FaceNet+TensorFlow
    人体姿态估计(骨骼关节点检测)发展历程回顾
    基于人脸的用户识别方案及思路
    人脸检测学习笔记(数据集-DLIB人脸检测原理-DLIB&OpenCV人脸检测方法及对比)
    基于opencv+ffmpeg的镜头分割
    如何让两个线程交替打印整数1-100?你的答案呢?
    Ubuntu16.04+TensorFlow r1.12环境搭建指南
    在Eclipse中打jar包
    Linux常用快捷键
  • 原文地址:https://www.cnblogs.com/startlearn/p/6026471.html
Copyright © 2020-2023  润新知