zoukankan      html  css  js  c++  java
  • 用范型实现链表代码理解

    在《CLR VIa C#》第三版 249页有这样一个例子:利用范型实现简单的链表,代码如下:

    public class Node<T>
        {
            public T _data;
            public Node<T> _next;
    
            public Node(T data) : this(data,null) { }
            public Node(T data,Node<T> next){
                this._data = data;
                this._next = next;
            }
    
            public override string ToString()
            {
                return _data.ToString() + (_next != null ? _next.ToString() : null);
            }
        }
    
        public class LeaderFunction
        {
            public void function()
            { 
    
             Node<char> head = new Node<char>('A');
             head = new Node<char>('B', head);
             head = new Node<char>('C', head);
             head = new Node<char>('D', head);
             head = new Node<char>('E', head);
    
             Console.WriteLine(head.ToString());
            }
    
        }
    

      执行结果是:EDCBA

    一开始有点小郁闷:为啥呢?看官请看:head = new Node<char>('B', head);

    这句话的意思就是,head重新定向,data=B,next指向上一个head。问题来了,你这个head是一个Node类型,当前的head指向新的node,node中的next指向上一个head,有点小乱,但归根结底问题就是,上个head都被别人抢走了,你还指向毛上个head

    想了一会,联想到之前的拆箱和装箱规则,顿时豁然开朗

    画个图,其实就明白了

    虽然head指向了新的对象,但是原有对象在堆中并没有gc掉,仍让保存则托管堆某块内存中,这个地址保存在每个next中。这样上面的疑问就不存在了!

    我们可以麻烦点,不要让堆中的对象处于悬浮状态,我们神明栈中的实例去指向他。就是这样

    代码如下:

      public class Node<T>
        {
            public T _data;
            public Node<T> _next;
    
            public Node(T data) : this(data,null) { }
            public Node(T data,Node<T> next){
                this._data = data;
                this._next = next;
            }
    
            public override string ToString()
            {
                return _data.ToString() + (_next != null ? _next.ToString() : null);
            }
        }
    
        public class LeaderFunction
        {
            public void function()
            { 
             Node<char> head = new Node<char>('A');
             Node<char> head1 = new Node<char>('B', head);
             Node<char> head2 = new Node<char>('C', head1);
             Node<char> head3 = new Node<char>('D', head2);
             Node<char> head4 = new Node<char>('E', head3);
    
             Console.WriteLine(head4.ToString());
            }
    
        }
    

      其实两种代码写法,对应两种堆,和堆栈的分配方式。但是第一种分配方式显然要简单的多!

  • 相关阅读:
    排序去重
    $(...)[0].attr is not a function问题
    daterangepicker的汉化和简单使用
    wx.openSetting的调整
    css3中-moz、-ms、-webkit与盒子模型
    动态翻滚的导航条
    CSS3 transition 浏览器兼容性
    jq实现两个input输入同时不为空时,改变确认框背景颜色
    js 监听input 实现数据绑定
    关于html 修改滚动条的问题
  • 原文地址:https://www.cnblogs.com/fjsnail/p/3245532.html
Copyright © 2011-2022 走看看