| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1009 人关注过本帖
标题:出个题目,O(n)时间里逆转单链表 补全函数。
只看楼主 加入收藏
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
结帖率:100%
收藏
 问题点数:0 回复次数:5 
出个题目,O(n)时间里逆转单链表 补全函数。

补写reverse函数,实现链表逆转。

递归的,非递归的。


程序代码:
#include<iostream>       
using namespace std;     
struct Exception{        
    Exception(){cout<<"Exception"<<endl;}
};                                     
template<class Type>                   
struct node{                           
    Type val;                          
    node<Type> *next;                  
    node<Type>(){next=NULL;}           
    node(Type v):val(v){next=NULL; }   
    friend ostream & operator<<(ostream &out,node<Type> & n)
        {                                                 
            out<<n.val;                                   
            return out;                                   
        }                                                 
};                                                        
template <class Type>                                     
class SList{                                              
private:                                                  
    node<Type> *hummy;                                    
protected:                                                
    node<Type> * getPre(node<Type> *pointer)              
        {                                                 
            try{                                          
                node<Type> * n;                           
                for(n=hummy;n!=NULL;n=n->next)            
                {                                         
                    if( n->next==pointer)                 
                        break;                            
                }                                         
                if( pointer== hummy)                      
                    throw Exception();                    
                return n;                                 
            }catch( Exception () )                        
            {                                             
                cout<<"Fist node with out pre node"<<endl;
                return NULL;                              
            }                                             
        }                                                 
    node<Type> * getNext(node<Type> *pointer)             
        {                                                 
            try{                                          
                if(pointer->next==NULL)                   
                    throw Exception ();                   
                return pointer->next;                     
            }catch( Exception e)                          
            {                                             
                cout<<"End of List"<<endl;                
                return NULL;                              
            }                                             
                                                          
        }                                                 
    bool insert(node<Type> *pointer, Type v)              
        {                                                 
            try                                           
            {                                             
                node<Type> *n=new node<Type>(v);          
                if( NULL == n )                           
                    throw Exception();                    
                else                                      
                {                                         
                    n->next=pointer->next;                
                    pointer->next=n;                      
                    return true;                          
                }                                         
            }catch (Exception e )                         
            {                                             
                cout<<"New Error"<<endl;                  
                return false;                             
            }                                             
        }                                                 
    bool del(node<Type> *pointer)                         
        {                                                 
            try                                           
            {                                             
                if( pointer != hummy->next)               
                {                                         
                    node<Type> * pre=getPre(pointer);     
                    pre->next=pointer->next;              
                    delete pointer;                       
                    pointer=NULL;                         
                }                                         
                else                                      
                {                                         
                    hummy->next=pointer->next;            
                    delete pointer;                       
                    pointer=NULL;                         
                }                                         
            }catch( Exception())                          
            {                                             

            }
        }  
public:    
    SList(){ hummy=new node<Type>();}
    SList(int n)                   
        {
            hummy=new node<Type>();
            for( int i=0;i<n;i++)
            {
                Type m;
                cin>>m;
                insert(hummy,m);
            }
        }
    friend void reverse( SList & s)
        {
        }
    void travel()
        {
            node<Type> * n;
            for( n=hummy->next; n!=NULL;n=n->next)
            {
                cout<<*n<<" ";
            }
            cout<<endl;
        }
};
int main()
{
    int m;
    cin>>m;
    SList<int> sl(m);
    sl.travel();
    reverse(sl);
    sl.travel();
    return 0;
}

搜索更多相关主题的帖子: 时间 函数 单链 
2010-01-07 19:05
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
发错版了,

我就是真命天子,顺我者生,逆我者死!
2010-01-07 19:16
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
回复 2楼 BlueGuy
Who cares....
2010-01-07 19:18
lijm1989
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:珠海
等 级:贵宾
威 望:12
帖 子:675
专家分:2844
注 册:2009-10-14
收藏
得分:0 
取出结节重装~~~好像是O(n)。。。非递归。。LZ看看合格不合格。。。不合格不要骂哈~~~大老远从这个贴(  https://bbs.bccn.net/thread-295021-1-1.html ) 飞过来的~~~递归的就不说了。。
程序代码:
#include<iostream>       
using namespace std;     
struct Exception{        
    Exception(){cout<<"Exception"<<endl;}
};                                     
template<class Type>                   
struct node{                           
    Type val;                          
    node<Type> *next;                  
    node<Type>(){next=NULL;}           
    node(Type v):val(v){next=NULL; }   
    friend ostream & operator<<(ostream &out,node<Type> & n)
        {                                                 
            out<<n.val;                                   
            return out;                                   
        }                                                 
};                                                        
template <class Type>                                     
class SList{                                              
private:                                                  
    node<Type> *hummy;                                    
protected:                                                
    node<Type> * getPre(node<Type> *pointer)              
        {                                                 
            try{                                          
                node<Type> * n;                           
                for(n=hummy;n!=NULL;n=n->next)            
                {                                         
                    if( n->next==pointer)                 
                        break;                            
                }                                         
                if( pointer== hummy)                      
                    throw Exception();                    
                return n;                                 
            }catch( Exception () )                        
            {                                             
                cout<<"Fist node with out pre node"<<endl;
                return NULL;                              
            }                                             
        }                                                 
    node<Type> * getNext(node<Type> *pointer)             
        {                                                 
            try{                                          
                if(pointer->next==NULL)                   
                    throw Exception ();                   
                return pointer->next;                     
            }catch( Exception e)                          
            {                                             
                cout<<"End of List"<<endl;                
                return NULL;                              
            }                                             
                                                          
        }                                                 
    bool insert(node<Type> *pointer, Type v)              
        {                                                 
            try                                           
            {                                             
                node<Type> *n=new node<Type>(v);          
                if( NULL == n )                           
                    throw Exception();                    
                else                                      
                {                                         
                    n->next=pointer->next;                
                    pointer->next=n;                      
                    return true;                          
                }                                         
            }catch (Exception e )                         
            {                                             
                cout<<"New Error"<<endl;                  
                return false;                             
            }                                             
        }                                                 
    bool del(node<Type> *pointer)                         
        {                                                 
            try                                           
            {                                             
                if( pointer != hummy->next)               
                {                                         
                    node<Type> * pre=getPre(pointer);     
                    pre->next=pointer->next;              
                    delete pointer;                       
                    pointer=NULL;                         
                }                                         
                else                                      
                {                                         
                    hummy->next=pointer->next;            
                    delete pointer;                       
                    pointer=NULL;                         
                }                                         
            }catch( Exception())                          
            {                                             

            }
        }  
public:    
    SList(){ hummy=new node<Type>();}
    SList(int n)                   
        {
            hummy=new node<Type>();
            for( int i=0;i<n;i++)
            {
                Type m;
                cin>>m;
                insert(hummy,m);
            }
        }
    friend void reverse( SList & s)
        {
            node<Type> *p=s.hummy->next, *temp=NULL;
            s.hummy->next = NULL;
            while (p)
              {
                   temp=p->next ;
                  p->next=s.hummy->next;
                   s.hummy->next=p;
                   p=temp;
              }
        }
    void travel()
        {
            node<Type> *n;
            for( n=hummy->next; n!=NULL;n=n->next)
            {
                cout<<n->val<<" ";
                //cout<<*n<<" "; //由于习惯了用VC6,很奇怪为什么VC6这里都会报错?VC6有那么弱么?,不过这里改了不影响reverse
            }
            cout<<endl;
        }
};
int main()
{
    int m;
    cin>>m;
    SList<int> sl(m);
    sl.travel();
    reverse(sl);
    sl.travel();
    return 0;
}
2010-01-08 14:00
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
以下是引用lijm1989在2010-1-8 14:00:38的发言:

取出结节重装~~~好像是O(n)。。。非递归。。LZ看看合格不合格。。。不合格不要骂哈~~~大老远从这个贴(  https://bbs.bccn.net/thread-295021-1-1.html ) 飞过来的~~~递归的就不说了。。
#include<iostream>      
 ...


good

VC这种垃圾编译器, 我那里已经重载输出流了。在structs里面。

g++ checked over.
2010-01-08 14:54
lijm1989
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:珠海
等 级:贵宾
威 望:12
帖 子:675
专家分:2844
注 册:2009-10-14
收藏
得分:0 
回复 5楼 Devil_W
嘿嘿··谢谢。。我一开始编译出错都很奇怪。。因为我都是先欣赏了一遍你的代码才开始想怎么完成的。。明明就重载了。。俄。。只好把那部分改了下。。
  悲剧了。。一开始老师就叫我们用VC。。都习惯了。。6.0太弱了。。搞友元的时候也很郁闷。。可能我打的补丁有问题。。vc2008装了没怎么用。。
  懂事后一直对6.0很不满。。这次这样的“bug”让我****。。。看来是时候换下编译器了~~~
2010-01-08 15:13
快速回复:出个题目,O(n)时间里逆转单链表 补全函数。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.028006 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved