题目:给定一个链表L和另一个链表P,它们包含以升序排列的整数。操作printLots打印L中那些由P所指定的位置上的元素。写出过程printLots(L,P)。只可以使用公有的STL容器操作。该过程的运行时间是多少?

我编写的程序如下:

#include <iostream>

using namespace std;

template <typename Object>
class List
{
private:
struct Node //List内部维护的节点类
{
Object data;
Node *prev;
Node *next; Node( const Object &d = Object(),Node *p = NULL,Node *n = NULL )
: data( d ),prev( p ),next( n ) { }
}; public:
class const_iterator //常量迭代器
{
public:
const_iterator() : current( NULL )
{ } const Object &operator*() const
{ return retrieve(); } const_iterator &operator++()
{
current = current->next;
return *this;
} const_iterator operator++( int )
{
const_iterator old = *this;
++( *this );
return old;
} bool operator== ( const const_iterator &rhs ) const
{ return current == rhs.current; } bool operator!= ( const const_iterator &rhs ) const
{ return !( *this == rhs ); } protected:
Node *current; Object &retrieve() const
{ return current->data; } const_iterator( Node *p ) : current( p )
{ } friend class List<Object>;
}; class iterator : public const_iterator //迭代器类继承自常量迭代器类
{
public:
iterator()
{ } Object &operator*()
{ return const_iterator::retrieve(); } const Object &operator*() const
{ return const_iterator::operator*(); } iterator &operator++()
{
const_iterator::current = const_iterator::current->next;
return *this;
} iterator operator++( int )
{
iterator old = *this;
++( *this ); return old;
} protected:
iterator( Node *p ) : const_iterator( p )
{ } friend class List<Object>;
}; public:
List()
{ init(); } ~List()
{
clear();
delete head;
delete tail;
} List( const List &rhs )
{
init();
*this = rhs;
} const List &operator= ( const List &rhs )
{
if ( this == &rhs )
return *this;
clear();
for ( const_iterator itr = rhs.begin() ; itr != rhs.end() ; ++itr )
push_back( *itr ); return *this;
} iterator begin()
{ return iterator( head->next ); }
const_iterator begin() const
{ return const_iterator( head->next ); }
iterator end()
{ return iterator( tail ); }
const_iterator end() const
{ return const_iterator( tail ); } int size() const
{ return theSize; }
bool empty() const
{ return size() == ; } void clear()
{
while ( !empty() )
pop_front();
} Object &front()
{ return *begin(); }
const Object &front() const
{ return *begin(); }
Object &back()
{ return *--end(); }
const Object &back() const
{ return *--end(); }
void push_front( const Object &x )
{ insert( begin(),x ); }
void push_back( const Object &x )
{ insert( end(),x ); }
void pop_front()
{ erase( begin() ); }
void pop_back()
{ erase( --end() ); } iterator insert( iterator itr,const Object &x )
{
Node *p = itr.current;
theSize++;
return ( p->prev = p->prev->next = new Node( x,p->prev,p ) );
} iterator erase( iterator itr )
{
Node *p = itr.current;
iterator retVal( p->next );
p->prev->next = p->next;
p->next->prev = p->prev;
delete p;
theSize--; return retVal;
} iterator erase( iterator start,iterator end )
{
for ( iterator itr = start ; itr != end; )
itr = erase( itr ); return end;
} private:
int theSize;
Node *head;
Node *tail; void init()
{
theSize = ;
head = new Node;
tail = new Node;
head->next = tail;
tail->prev = head;
}
}; void printLots( List<int> &L,List<int> &P ) //打印出L链表 指定位置(P中存放)的值
{
List<int>::const_iterator itr = L.begin();
int count = ; //P是升序排列那么不必每次遍历L,维护计数器一直递增迭代器即可 for ( List<int>::const_iterator itr_P = P.begin() ; itr_P != P.end() ; ++itr_P ){
int pos = *itr_P;
while ( pos != count ){
if ( itr == L.end() )
return ;
count++;
itr++;
}
if ( itr != L.end() )
cout << *itr << endl;
} return ;
} int main( void )
{
List<int> p,temp;
p.push_back( );
p.push_back( ); temp.push_back( );
temp.push_back( ); cout << "The pos List:" << endl; for ( List<int>::iterator iter = p.begin() ; iter != p.end() ; ++iter )
cout << *iter << " "; cout << endl; cout << "The temp List:" << endl;
printLots( temp,p ); return ;
}

运行结果:

printLots过程中temp链表迭代P中的最大值 次,所以运行时间是取决于P中最后一个元素N,O(N)。

根据存放位置数据的链表P打印链表L的元素的更多相关文章

  1. MySQL数据库数据存放位置修改

    MySQL数据库数据存放位置修改 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品.MySQL 最流行的关系型数据库管理系统,在 WEB 应用方 ...

  2. Navicat数据存放位置和备份数据库路径设置

    navicat的数据库存放位置在什么地方?带着这样的疑问,我们去解决问题,navicat是默认安装,mysql也是默认安装,数据库存在默认用户所在的目录下面. 安装MySQL时,请选择“Custom” ...

  3. InnoDB引擎数据存放位置

    InnoDB引擎的mysql数据存放位置 采用InnoDB引擎的数据库创建表后,会在mysql数据存放目录下生成一个和数据库名相同的目录.该目录下包涵一个db.opt文件和该库下所有表同名的frm文件 ...

  4. rabbitmq更换数据文件和日志文件的存放位置

    原来的默认位置是/var下 需要将这些文件更换位置 1.先创建数据文件和日志文件存放位置的目录并给权限 mkdir -p /usr/local/rabbitmq/mnesia mkdir -p /us ...

  5. MySQL数据文件介绍及存放位置

    怎样查看MySql数据库物理文件存放位置? 使用命令行查找: show global variables like '%datadir%'; 我查找的位置:C:\ProgramData\MySQL\M ...

  6. 剑指Offer面试题:4.从尾到头打印链表

    一.题目:从尾到头打印链表 题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值. 到解决这个问题肯定要遍历链表.遍历的顺序是从头到尾的顺序,可输出的顺序却是从尾到头.也就是说第一个遍历到的结 ...

  7. P51、面试题5:从尾到头打印链表

    题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值. 链表结点定义如下: Struct ListNode{ int   m_nKey; ListNode*   m_pNext; }; 我们可 ...

  8. 面试:用 Java 逆序打印链表

    昨天的 Java 实现单例模式 中,我们的双重检验锁机制因为指令重排序问题而引入了 volatile 关键字,不少朋友问我,到底为啥要加 volatile 这个关键字呀,而它,到底又有什么神奇的作用呢 ...

  9. 《剑指offer》从尾到头打印链表

    本题来自<剑指offer> 从尾到头打印链表 题目: 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 思路: 方案一:首先遍历到尾部,然后从尾部进行到头值进行操作,后进先 ...

随机推荐

  1. 张艾迪(创始人):AOOOiA.global因梦想而诞生

    AOOOiA.global因梦想而诞生 The World No.1 Girl :Eidyzhang The World No.1 Internet Girl :Eidyzhang AOOOiA.gl ...

  2. 张艾迪(创始人):发明Global.World.224C的天才

    Eidyzhang: Genius.Founder.CEO.23 I 世界级最高级创始人.世界最高级FounderCEO 出生在亚洲中国.Eidyzhang 拥有黑色头发白色皮肤(20岁)大学辍学生. ...

  3. ztree 展示

    1. controller@RequestMapping("/function.htm") public String function(HttpSession session, ...

  4. Struts、JSTL标签库的基本使用方法

    一 使用Struts标签之前需要经过下面3个步骤的配置. 1.导入TLD文件. 2.在web.xml中注册标签库. 3.在页面中引入标签库. 下面详细介绍以上步骤. 1 导入TLD文件. TLD文件是 ...

  5. http请求详解

    GET GET方法意思是获取被请求URI(Request-URI)指定的信息(以实体的格式).如果请求URI涉及到一个数据生成过程,那么这个过程生成的数据应该被作为实体在响应中返回而不是过程的源文本, ...

  6. Introduction to Windows 8: The Definitive Guide for Developer

    <Windows 8应用开发权威指南>介绍 Introduction to Windows 8: The Definitive Guide for Developer 一.封面设计要求及文 ...

  7. Linux Mysql 1130错误解决

      今天在win32下通过navicat 远程登录Mysql时出现如下错误:     想都不用想,肯定是Mysql的访问权限问题.   首先,通过终端(我用的是SSH)远程登录到Linux服务器,为了 ...

  8. Entity Framework系列

    这个系列主要记录学习EF的过程和碰到的问题以及解决问题的方法. EF中的那些批量操作 EF的Model First

  9. 对Docker的价值和应用场景分析

    近年来,Docker在IT界可谓风光十足,各大技术论坛上赚足了眼球,公司内外也有相当多的介绍和尝试,看上去如此高大上的技术,貌似会给云.服务部署.运维等领域带来颠覆性的创新. 近期查阅了一些文档,较深 ...

  10. QPS

    你想建设一个能承受500万PV/每天的网站吗? 博客分类: 移动行业 PV  转自:http://elf8848.iteye.com/blog/967049 你想建设一个能承受500万PV/每天的网站 ...