面试-双向链表

news/2024/7/7 9:48:48 标签: 面试, 数据结构与算法

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

   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


http://www.niftyadmin.cn/n/664538.html

相关文章

Java虚拟机(一)结构原理与运行时数据区域

前言 本来计划要写Android内存优化的,觉得有必要在此之前介绍一下Java虚拟机的相关知识,Java虚拟机也并不是三言两语能够介绍完的,因此开了Java虚拟机系列,这一篇文章我们来学习Java虚拟机的结构原理与运行时数据区域。 1.Java虚拟…

[美食]台湾夜市空降上海 33元吃到饱

正宗的台湾夜市小吃搬到上海咯!一家来自台 湾的自助式餐厅近日在上海长宁区延安西路近虹许路开张。大肠包小肠、蚵仔煎、牛肉面、担仔面、天妇罗、生炒花枝、台湾刨冰、台湾水果……食客在该店试营业 期间只需要花33元(下午茶/宵夜价格)&…

【codeforces 733F】 Drivers Dissatisfaction

http://codeforces.com/problemset/problem/733/F (题目链接) 题意 给出一张n个点的无向图,每一条变有两个特征值:${w,c}$;分别表示这条边的权值为${w}$,每将这条边的权值减小1需要充${c}$元钱。初始时有${S}$元钱&…

Java虚拟机(二)对象的创建与OOP-Klass模型

相关文章 Java虚拟机系列 前言 在前一篇文章中我们学习了Java虚拟机的结构原理与运行时数据区域,那么我们大概知道了Java虚拟机的内存的概况,那么内存中的数据是如何创建和访问的呢?这篇文章会给你答案。 1.对象的创建 对象的创建通常是通过…

IIS http 错误 401.3 - unauthorized

iis http 错误 401.3 - unauthorized 向物理目录添加iis_iusrs用户权限。转载于:https://www.cnblogs.com/zhanqun/p/5508954.html

Python 2.5 Quick Reference

Python 2.5 Quick Reference 收藏 <script type"text/javascript"> document.body.oncopy function() { if (window.clipboardData) { setTimeout(function() { var text clipboardData.getData(&quot;text&quot;); if (text &amp;&amp; t…

关于离职和领导交流完毕的感受

上回和段总聊了一下&#xff0c;聊完之后我真的是又坚定了离开的想法。我说我要离开时因为我的自学能力在逐步的下降&#xff0c;我自己学些的动力被一点一点的消磨掉了。早上我卡着点来是因为李萍老师&#xff0c;原因就是我不想听他放那些乱七八糟的音乐&#xff08;我认为这…

dell n2000 组播抑制

dell n2000 组播抑制 http://en.community.dell.com/support-forums/network-switches/f/866/t/19677497http://en.community.dell.com/support-forums/network-switches/f/866/t/19650967http://www.dell.com/Support/Article/us/en/04/SLN295739 # vlan20是组播vlan, 192.168…