加班后,余兴未了,写了个链表,呵呵放出来充实下blog先

原创 2007年10月12日 00:17:00
 /**//// <summary>
    
/// 结点
    
/// </summary>
    
/// <typeparam name="T">泛型对象</typeparam>

    internal class LNode<T>
    
...{
        
/**//// <summary>
        
/// 构造函数
        
/// </summary>

        public LNode()
        
...{
        }


        
/**//// <summary>
        
/// 构造函数 设置泛型值
        
/// </summary>
        
/// <param name="NodeValue">结点</param>

        public LNode(T NodeValue)
        
...{
            _Data 
= NodeValue;
        }


        
private T _Data=default (T) ;
        
/**//// <summary>
        
/// 值
        
/// </summary>

        public T Data
        
...{
            
get ...return _Data; }
            
set ...{ _Data = value; }
        }


        
private LNode<T> _Next=null ;
        
/**//// <summary>
        
/// 下一个节点
        
/// </summary>

        public LNode<T> Next
        
...{
            
get ...return _Next; }
            
set ...{ _Next = value; }
        }


    }

 

上面是结点

下面是表定义

 

 /**//// <summary>
    
/// 单链表
    
/// </summary>

    public class LinkList<T>
    
...{
        
/**//// <summary>
        
/// 构造函数
        
/// </summary>

        public LinkList()
        
...{
            
//表头等于表尾
            _EndNode = _HeadNode;
        }


        
/**//// <summary>
        
/// 索引
        
/// </summary>
        
/// <param name="index">索引ID</param>
        
/// <returns>结点值</returns>

        public T this[int index]
        
...{
            
get
            
...{
                
return GetData(index);
            }

            
set
            
...{
                Modify(index, value);
            }

        }


        
private int _Length = 0;
        
/**//// <summary>
        
/// 单链表长度
        
/// </summary>

        public int Length
        
...{
            
get ...return _Length; }
        }



        
private LNode<T> _HeadNode=new LNode<T> ();     //头结点
        private LNode<T> _EndNode = new LNode<T>();      //尾结点

        
/**//// <summary>
        
/// 寻找结点
        
/// </summary>
        
/// <param name="index">索引ID</param>
        
/// <returns>结点</returns>
        
/// <exception cref="System.IndexOutOfRangeException">索引号超出单链表长度</exception>

        private LNode<T> Find(int index)
        
...{
            
if (index >= _Length) throw new IndexOutOfRangeException("索引号超出单链表长度");
            LNode
<T> FindNode=new LNode<T> ();
            FindNode 
= _HeadNode.Next;
            
for (int iCount = 0; iCount < index; iCount++)
            
...{
                FindNode 
= FindNode.Next;
            }

            
return FindNode;
        }


        
/**//// <summary>
        
/// 得到结点值
        
/// </summary>
        
/// <param name="index">索引ID</param>
        
/// <returns>结点值</returns>

        public T GetData(int index)
        
...{
            
//索引不合法
            if (index < 0 || index >= _Length) return default(T);
            
//返回找到的值
            return Find(index).Data;
        }


        
/**//// <summary>
        
/// 表尾添加结点
        
/// </summary>
        
/// <param name="NodeValue">结点值</param>

        public void Append(T NodeValue)
        
...{
            LNode
<T> NewNode = new LNode<T>(NodeValue);
            _EndNode.Next 
= NewNode;
            _EndNode 
= NewNode;
            
if(_Length==0) _HeadNode .Next =NewNode ;
            
++_Length;
        }


        
/**//// <summary>
        
/// 插入表头
        
/// </summary>
        
/// <param name="NodeValue">结点值</param>

        public void InsertFirst(T NodeValue)
        
...{
            LNode
<T> ListNode = new LNode<T>(NodeValue);
            ListNode.Next 
= _HeadNode.Next;
            _HeadNode.Next 
= ListNode;
            
//如果为空表 尾结点设置
            if (_Length == 0) _EndNode = ListNode;
            
++_Length;
        }


        
/**//// <summary>
        
/// 插入结点 索引之前
        
/// </summary>
        
/// <param name="index">索引ID</param>
        
/// <param name="NodeValue">结点值</param>
        
/// <returns>true表示插入成功,false表示插入失败</returns>

        public bool InsertBefore(int index, T NodeValue)
        
...{
             
//如果小于长度 返回假
            if (index < 0 || index >= _Length) return false;
            
//如果为头结点
            if (index == 0)
            
...{
                LNode
<T> InsertNode = new LNode<T>(NodeValue);
                InsertNode.Next 
= _HeadNode.Next;
                _HeadNode.Next 
= InsertNode;
                
++_Length;
                
return true;
            }

            
//如果为中间结点
            LNode<T> FindNode = Find(index - 1);
            LNode
<T> InsNode=new LNode<T> (NodeValue );
            InsNode.Next 
= FindNode.Next;
            FindNode.Next 
= InsNode;
            
++_Length;
            
return true;
        }


        
/**//// <summary>
        
/// 插入结点 索引之后
        
/// </summary>
        
/// <param name="index">索引ID</param>
        
/// <param name="NodeValue">结点值</param>
        
/// <returns>true表示插入成功,false表示插入失败</returns>

        public bool InsertAfter(int index, T NodeValue)
        
...{
            
//如果小于长度 返回假
            if (index < 0 || index >= _Length) return false;
            
//如果为尾结点
            if (index == _Length-1)
            
...{
                Append(NodeValue);
                
return true;
            }

           
            
//如果为中间结点
            LNode<T> FindNode = Find(index);
            LNode
<T> InsertNode = new LNode<T>(NodeValue);
            InsertNode.Next 
= FindNode.Next;
            FindNode.Next 
= InsertNode;
            
++_Length;
            
return true;
        }


        
/**//// <summary>
        
/// 修改结点值
        
/// </summary>
        
/// <param name="index">索引ID</param>
        
/// <param name="NodeValue">结点值</param>
        
/// <returns>true表示修改成功,false表示修改失败</returns>

        public bool Modify(int index, T NodeValue)
        
...{
            
//索引不合法
            if (index < 0 || index >= _Length) return false;
            
//如果为尾结点
            if (index == _Length - 1)
            
...{
                _EndNode.Data 
= NodeValue;
                
return true;
            }

            
//如果为中间结点
             Find(index).Data =NodeValue ;
             
return true;
        }


        
/**//// <summary>
        
/// 删除结点值
        
/// </summary>
        
/// <param name="index">索引ID</param>
        
/// <returns>删除的结点值</returns>

        public T Delete(int index)
        
...{
            
//索引不合法
            if (index < 0 || index >= _Length) return default(T);
            
//如果为头结点
            if (index == 0)
            
...{
                LNode
<T> DelNode = _HeadNode.Next;
                _HeadNode.Next 
= DelNode.Next;
                
--_Length;
                
return DelNode.Data;
            }


            LNode
<T> FindNode = Find(index - 1);
            LNode
<T> DelNode2 = FindNode.Next;
            FindNode.Next 
= DelNode2.Next;             //也可以是FindNode.Next = FindNode.Next.Next
            --_Length;
            
return DelNode2.Data;
        }


       
       
    }

 

慢慢把他完善

用microsoft自带的类分词 10w 2秒,自己的大概要8秒左右,所以决定优化自己的基础类。一步一步来,慢慢优化

总有一天超越他。虽然已经解决10w分词1秒搞定,不过学无止境,所以day day study,day day up

 

为什么在重写了equals()方法之后也必须重写hashCode()方法

我们都知道Java语言是完全面向对象的,在java中,所有的对象都是继承于Object类。Ojbect类中有两个方法equals、hashCode,这两个方法都是用来比较两个对象是否相等的。    ...
  • gao_chun
  • gao_chun
  • 2015年04月02日 17:15
  • 6313

由先序遍历和中序遍历构造二叉树的二叉链表代码

转载自:http://blog.csdn.net/sunmeng_007/article/details/8095224 #include //定义节点 typedef struct btnode {...
  • ilikeprograming
  • ilikeprograming
  • 2013年12月28日 11:31
  • 1512

二叉树的线索化以及 线索化的先序,中序,后序遍历

先简要说下什么线索化 二叉树是一种非线性结构,遍历二叉树几乎都是通过递归或者用栈辅助实现非递归的遍历。用二叉树作为存储结构时,取到一个节点,只能获取节点的左孩子和右孩子,不能直接得到节点的任一遍历序...
  • wenqiang1208
  • wenqiang1208
  • 2017年02月18日 20:03
  • 338

链表之实现对二进制数的加一操作

建链表:二进制数可用带头结点的单链表存储,第一个节点存储二进制数的最高位,依次存储,最后一个节点存储位二进制数的最低位。 二进制数的加法规则:实现二进制数加1运算,方向从最低位往高位找到第一个为0的位...
  • l2580258
  • l2580258
  • 2016年04月10日 00:19
  • 381

[树]二叉排序树的建立与先序遍历

描述:采用二叉链表方式存储二叉排序树。从空树开始,将输入元素按照输入顺序逐个插入一颗二叉排序树,以生成二叉排序树,并输出先序遍历的结果。输入说明第一行为整数n,表示将输入n个数字。第二行为n个整数,为...
  • qq_27848507
  • qq_27848507
  • 2016年01月11日 12:02
  • 946

二叉排序树转换成双向链表

在面试过程中经常会出现二叉排序树转换成双向链表的问题 思路:在二叉树的学习中,我会发现,基本所有的问题都可以用树的先序遍历、中序遍历、后序遍历解决,所以我们可以使用这个思路来解决。 在此问题中,使...
  • qq_32655383
  • qq_32655383
  • 2016年06月27日 19:38
  • 534

链表应用----二进制数加1进位表示链表存储

问题描述:建立一个带头结点的线性链表,用以存放输入的二进制数, 链表的每一个data域存放一个二进制位,并在此链表上实现对二进制数加1的运算。 问题分析如图:...
  • gamedevgra
  • gamedevgra
  • 2017年01月19日 21:38
  • 190

运算符重载之先加和后加++以及【】的运用

#include"aa.h" #include #include #include class bb { public: char *i; bb () {this->i=0; cout } bb...
  • KAIFAWORD
  • KAIFAWORD
  • 2015年03月06日 12:21
  • 374

基于三叉链表存储结构的二叉树的不用栈的非递归遍历

三叉链表和二叉链表的不同在于,三叉链表多了一个parent指针域,指向双亲节点。便于访问双亲节点。 有了这个parent指针域,我们就能实现不用栈的非递归遍历二叉树。 现在,让我们来看看基于三叉链...
  • SKY453589103
  • SKY453589103
  • 2015年05月18日 23:18
  • 2010

【数据结构作业四】以二叉链表作存储结构,建立一棵二叉树,并输出该二叉树的先序、中序、后序遍历序列、高度和其叶子结点数。

#include #define MAXSIZE 100 using namespace std; typedef char TElemType; typedef struct BiTNode { ...
  • tf1997
  • tf1997
  • 2017年10月26日 18:25
  • 1323
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:加班后,余兴未了,写了个链表,呵呵放出来充实下blog先
举报原因:
原因补充:

(最多只允许输入30个字)