Skip List, C#实现

温习下数据结构, C#版的Skip List实现

 

ExpandedBlockStart.gif Skip List
namespace  Ln.SkipList
{
    
///   <summary>
    
///  the values of list is ascend.
    
///   </summary>
     public   class  SkipList
    {
        
private  SkipNode head;
        
private  System.Random randomFa  =   new  System.Random();

        
public  SkipList(){}
        
///   <summary>
        
///  Initialize skip list
        
///   </summary>
        
///   <returns></returns>
         public   bool  Init()
        {
            head 
=   new  SkipNode( 0 null null );
            
return   true ;
        }

        
///   <summary>
        
///  Clean skip list
        
///   </summary>
        
///   <returns></returns>
         public   bool  Clear()
        {
            head 
=   null ;
            
return   true ;
        }

        
///   <summary>
        
///  Insert value to skip list
        
///   </summary>
        
///   <param name="value"></param>
        
///   <returns> if the value exists in the list already, return false. </returns>
         public   bool  Insert( int  value)
        {
            
if  (head.nextNode  ==   null )
            {
                SkipNode newNode 
=   new  SkipNode(value,  null null );
                head.nextNode 
=  newNode;
                
return   true ;
            }

            
// check if value existed in the list. check first because prevent duplicated level while raise level.
             if  (Search(value)  ==   true )
            {
                
return   false ;
            }

            SkipNode current 
=  head;
            
if  (head.nextNode.nextNode  !=   null )
            {
                
// If random > 0.7, raise the hight of level                
                 double  random  =  randomFa.NextDouble();       // get random between 0.0 and 1.0                
                 if  (random  >   0.7 )                
                {
                    
// Check vaule if exists in highest level
                    current  =  head.nextNode;
                    
while  (current  !=   null )
                    {
                        
if  (value  ==  current.value)
                        {
                            
return   false ;
                        }
                        current 
=  current.nextNode;
                    }

                    current 
=  head;

                    
if  (head.nextNode.value  <  value)
                    {
                        SkipNode newNode 
=   new  SkipNode(head.nextNode.value,  null null );
                        newNode.downNode 
=  head.nextNode;
                        head.nextNode 
=  newNode;
                        newNode.nextNode 
=   new  SkipNode(value,  null null );
                    }
                    
else
                    {
                        SkipNode newNode 
=   new  SkipNode(value,  null null );
                        newNode.nextNode 
=   new  SkipNode(head.nextNode.value,  null null );
                        newNode.nextNode.downNode 
=  head.nextNode;
                        head.nextNode 
=  newNode;
                    }

                    
// If value insert to the first note of list
                     if  (head.nextNode.value  ==  value)
                    {
                        current 
=  head.nextNode;
                        
while  (current.nextNode.downNode  !=   null )
                        {
                            SkipNode newNode 
=   new  SkipNode(value,  null null );
                            newNode.nextNode 
=  current.nextNode.downNode;
                            current.downNode 
=  newNode;
                            current 
=  current.downNode;
                        }
                        
return   true ;
                    }

                    current 
=  head.nextNode.downNode;
                    SkipNode upNode 
=  head.nextNode.nextNode;
                    
do
                    {
                        
while  (current.nextNode  !=   null   &&  value  >  current.nextNode.value)
                        {
                            current 
=  current.nextNode;
                        }
                        
if  (current.nextNode  !=   null   &&  value  ==  current.nextNode.value)
                        {
                            upNode.downNode 
=  current.nextNode;
                            
return   false ;
                        }
                        SkipNode newNode 
=   new  SkipNode(value,  null null );
                        upNode.downNode 
=  newNode;
                        upNode 
=  newNode;
                        newNode.nextNode 
=  current.nextNode;
                        current.nextNode 
=  newNode;
                        current 
=  current.downNode;
                    } 
while  (current  !=   null );

                    
return   true ;
                }
            }

            current 
=  head;
            
do
            {
                
while  (current.nextNode  !=   null   &&  value  >  current.nextNode.value)
                {
                    current 
=  current.nextNode;
                }
                
if  (current.nextNode  !=   null   &&  value  ==  current.nextNode.value)
                {
                    
return   false ;
                }
                
// insert in the lowest level
                 if  (current.downNode  ==   null )
                {
                    SkipNode newNode 
=   new  SkipNode(value,  null null );
                    newNode.nextNode 
=  current.nextNode;
                    current.nextNode 
=  newNode;
                    
return   true ;
                }

                
// while gap>3, insert in current and lower level
                 if  (current.downNode.nextNode  !=   null   &&  current.downNode.nextNode.nextNode  !=   null   &&  value  >  current.downNode.nextNode.nextNode.value)
                {
                    SkipNode rootNode 
=   new  SkipNode(value,  null null );
                    rootNode.nextNode 
=  current.nextNode;
                    current.nextNode 
=  rootNode;
                    current 
=  current.downNode.nextNode.nextNode;
                    
while  (current  !=   null )
                    {
                        
while  (current.nextNode  !=   null   &&  value  >  current.nextNode.value)
                        {
                            current 
=  current.nextNode;
                        }
                        
if  (current.nextNode  !=   null   &&  value  ==  current.nextNode.value)
                        {
                            
return   false ;
                        }
                        SkipNode newNode 
=   new  SkipNode(value,  null null );
                        rootNode.downNode 
=  newNode;
                        rootNode 
=  newNode;
                        newNode.nextNode 
=  current.nextNode;
                        current.nextNode 
=  newNode;
                        current 
=  current.downNode;
                    }
                    
return   true ;
                }
                current 
=  current.downNode;
            } 
while  (current  !=   null );

            
return   true ;
        }

        
public   bool  Search( int  value)
        {
            
if  (head.nextNode  ==   null )
            {
                
return   false ;
            }

            SkipNode current 
=  head;
            
do
            {
                
while  (current.nextNode  !=   null   &&  value  >  current.nextNode.value)
                {
                    current 
=  current.nextNode;
                }
                
if  (current.nextNode  !=   null   &&  value  ==  current.nextNode.value)
                {
                    
return   true ;
                }
                current 
=  current.downNode;
            } 
while  (current  !=   null );
            
return   false ;
        }

        
public   bool  Remove( int  value)
        {
            
if  (head.nextNode  ==   null )
            {
                
return   false ;
            }
            SkipNode current 
=  head;
            
do  
            {
                
while  (current.nextNode  !=   null   &&  value  >  current.nextNode.value)
                {
                    current 
=  current.nextNode;
                }
                
if  (current.nextNode  !=   null   &&  value  ==  current.nextNode.value)
                {
                    current.nextNode 
=  current.nextNode.nextNode;
                    current 
=  current.downNode;
                    
continue ;
                }
                current 
=  current.downNode;
            }
            
while  (current  !=   null );
            
return   true ;
        }

        
public   string  Display()
        {
            
if  (head.nextNode  ==   null )
            {
                
return   "" ;
            }

            SkipNode current 
=  head;
            SkipNode level 
=  head.nextNode;
            
string  rlt  =   "" ;
            
while  (level  !=   null )
            {
                current 
=  level;
                
do
                {
                    rlt 
+=   " —— "   +  current.value;
                    current 
=  current.nextNode;
                } 
while  (current  !=   null );
                rlt 
+=  System.Environment.NewLine;
                level 
=  level.downNode;
            }
            
return  rlt;
        }
    }

    
class  SkipNode
    {
        
public   int  value;
        
public  SkipNode downNode;
        
public  SkipNode nextNode;

        
public  SkipNode()
        {
            value 
=   0 ;
            downNode 
=   null ;
            nextNode 
=   null ;
        }
        
public  SkipNode( int  value, SkipNode downNode, SkipNode nextNode)
        {
            
this .value  =  value;
            
this .downNode  =  downNode;
            
this .nextNode  =  nextNode;
        }
    }
}


ExpandedBlockStart.gif 测试用代码
using  System;
using  System.Collections.Generic;
using  System.Text;
using  Ln.SkipList;

namespace  TestConsoleApplication
{
    
class  Program
    {
        
static   void  Main( string [] args)
        {
            Random ran 
=   new  Random();
            SkipList skipList 
=   new  SkipList();
            skipList.Init();
            
int  j;
            
for  ( int  i  =   0 ; i  <   15 ; i ++ )
            {
                j 
=  ran.Next( 0 100 );
                skipList.Insert(j);
                Console.WriteLine(skipList.Search(j));
            }
            Console.WriteLine(skipList.Display());
            Console.ReadLine();
        }
    }
}

 

 

转载于:https://www.cnblogs.com/linc09/archive/2010/02/28/1675292.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值