zoukankan      html  css  js  c++  java
  • 学习笔记链表练习,模仿StringBuilder的山寨版StringBuilder

    学习笔记---链表练习,模仿StringBuilder的山寨版StringBuilder,见代码

    代码
    using System;

    namespace System.MyText//山寨命名空间
    {
    //表示链表,内嵌节点类的定义
    public sealed class NodeBuilder
    {
    //定义节点类,嵌套类,对内可用,对外隐藏
    sealed class Node
    {
    private char _nodevalue;//节点值
    private Node _nextnode;//下一节点

    //public Node(char nodevalue,Node nextnode)//经典错误,产生了“鸡与蛋的问题”
    public Node(char nodevalue)
    {
    this._nodevalue = nodevalue;
    this._nextnode = null;
    }

    //节点通常要求:内部值不可改变,称为可换不可修
    public char NodeValue
    {
    get
    {
    return this._nodevalue;
    }
    }
    //本处为了单纯的拼合操作要求,只有空节点之后方能添加新的有效节点
    public Node NextNode
    {
    get
    {
    return this._nextnode;
    }
    set
    {
    if (value != null)//传入的节点有效
    {
    if (this.NextNode == null)//本节点后续为空
    {
    this._nextnode = value;//将新的节点接续在本节点之后
    }
    else
    {
    //nothing to do here!
    }
    }
    else
    {
    //nothing to do here!
    }
    }
    }
    }

    //链表内部成员
    private Node _headnode;//头节点
    private Node _endnode;//尾节点
    private int _nodecount;//节点计数

    //无参构造---造成一个有效的空链表---有容器,但是无数据内容
    public NodeBuilder()
    {
    this._headnode = null;
    this._endnode = null;
    this._nodecount = 0;
    }

    //唯一可以直接对外公开的属性
    public int NodeCount
    {
    get
    {
    return this._nodecount;
    }
    }

    //添加字符串的对外方法
    public void Append(string text)
    {
    if (text != null && text.Length > 0)
    {
    Node newnode
    = null;
    foreach (char onechar in text)
    {
    newnode
    = new Node(onechar);
    this.addNode(newnode);
    }
    }
    else
    {
    //nothing to do here!
    }
    }
    //私有业务方法---直接添加节点
    private void addNode(Node node)
    {
    if (this._headnode == null)//当前为空表
    {
    this._headnode = node;
    this._endnode = node;
    }
    else//当前不为空表
    {
    this._endnode.NextNode = node;//新节点接续在尾节点之后
    this._endnode = this._endnode.NextNode;//当前尾节点向后移动一位
    }
    this._nodecount++;
    }

    //将链表内容转化为字符串的公有方法
    public override string ToString()
    {
    string str;

    //字符串---字符串成串---字符集合---字符数组
    char[] ary = new char[this.NodeCount];
    //填充字符数组
    Node currentnode;//表示当前节点的访问权,类似于数据库中的游标
    currentnode = this._headnode;//将访问权重置在集合头部
    int index = 0;
    while (currentnode != null)
    {
    ary[index]
    = currentnode.NodeValue;//填充当前节点的字符值
    currentnode = currentnode.NextNode;//将当前操作位置后移一位
    index++;//将数组中的当前操作位置对应后移一位
    }
    str
    = new String(ary);

    return str;
    }
    }
    }
  • 相关阅读:
    局域网内其他机器访问本机80网站失败记录
    百度经纬度获取
    Win10安装安卓ADB驱动
    SQL Server 查看数据库是否存在阻塞
    IP地址接口小结
    雄冠条码PV系统-2016-05-17-收获
    slf4j MDC使用
    Java NIO之通道
    Java NIO之缓冲区
    记一次ThreadPoolExecutor面试
  • 原文地址:https://www.cnblogs.com/cs_net/p/1837969.html
Copyright © 2011-2022 走看看