根据存放位置数据的链表P打印链表L的元素
题目:给定一个链表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的元素的更多相关文章
- MySQL数据库数据存放位置修改
MySQL数据库数据存放位置修改 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品.MySQL 最流行的关系型数据库管理系统,在 WEB 应用方 ...
- Navicat数据存放位置和备份数据库路径设置
navicat的数据库存放位置在什么地方?带着这样的疑问,我们去解决问题,navicat是默认安装,mysql也是默认安装,数据库存在默认用户所在的目录下面. 安装MySQL时,请选择“Custom” ...
- InnoDB引擎数据存放位置
InnoDB引擎的mysql数据存放位置 采用InnoDB引擎的数据库创建表后,会在mysql数据存放目录下生成一个和数据库名相同的目录.该目录下包涵一个db.opt文件和该库下所有表同名的frm文件 ...
- rabbitmq更换数据文件和日志文件的存放位置
原来的默认位置是/var下 需要将这些文件更换位置 1.先创建数据文件和日志文件存放位置的目录并给权限 mkdir -p /usr/local/rabbitmq/mnesia mkdir -p /us ...
- MySQL数据文件介绍及存放位置
怎样查看MySql数据库物理文件存放位置? 使用命令行查找: show global variables like '%datadir%'; 我查找的位置:C:\ProgramData\MySQL\M ...
- 剑指Offer面试题:4.从尾到头打印链表
一.题目:从尾到头打印链表 题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值. 到解决这个问题肯定要遍历链表.遍历的顺序是从头到尾的顺序,可输出的顺序却是从尾到头.也就是说第一个遍历到的结 ...
- P51、面试题5:从尾到头打印链表
题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值. 链表结点定义如下: Struct ListNode{ int m_nKey; ListNode* m_pNext; }; 我们可 ...
- 面试:用 Java 逆序打印链表
昨天的 Java 实现单例模式 中,我们的双重检验锁机制因为指令重排序问题而引入了 volatile 关键字,不少朋友问我,到底为啥要加 volatile 这个关键字呀,而它,到底又有什么神奇的作用呢 ...
- 《剑指offer》从尾到头打印链表
本题来自<剑指offer> 从尾到头打印链表 题目: 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 思路: 方案一:首先遍历到尾部,然后从尾部进行到头值进行操作,后进先 ...
随机推荐
- 你不知道的JavaScript--值得你挑战的JavaScript面试题(45题)
1,以下表达式的运行结果是: ["1","2","3"].map(parseInt) A.["1","2&qu ...
- 51nod 1050 循环数组最大子段和
题目链接:51nod 1050 循环数组最大子段和 #include<stdio.h> #include<algorithm> using namespace std; ; l ...
- SQL Server数据库(作业讲解和复习)
--第一题 查询Student表中的所有记录的Sname.Ssex和Class列.select Sname,Ssex,Class from student --第二题 查询教师所有的单位即不重复的De ...
- VMware vSphere Client5.0与 Windows8不再有问题,解决VMware 5.0 客户端提示VMRC控制台的连接已断开
问题:VMware 5.0 客户端提示VMRC控制台的连接已断开...正在尝试重新连接,系统是win8的 网上解决办法: WIN8,在安装vmware vsphere client 5.0时出现兼容性 ...
- Java三大特征之------多态
1.定义 指允许不同类的对象对同一消息做出响应.即同一消息可以根据发送对象的不同而采用多种不同的行为方式. 2.存在条件 2.1存在父子关系 2.2子类中存在重写方法 2.3父类类型的变量指向子类对象 ...
- 获取图片颜色的rgb,以供css设计背景颜色
ColorPix
- oracle常见权限分配
1.GRANT 赋于权限 常用的系统权限集合有以下三个: CONNECT(基本的连接), RESOURCE(程序开发), DBA(数据库管理) 常用的数据对象权限有以下五个: ALL ON 数据对象名 ...
- 图形界面报错“已拒绝X11转移申请”的解决方法
今天想通过本机给虚拟机起x-manager图形界面的时候报出 解决办法: 1.原来X11 forwarding依赖“xorg-x11-xauth”软件包,所以必须先安装“xorg-x11-xauth” ...
- 解决extjs grid 不随窗口大小自适应的问题
解决extjs grid 不随窗口大小自适应的问题 August 30, 2010 zhai Javascript 8,403 viewsGo to comment 最近遇到的问题,在使用grid的时 ...
- 老男孩linux高级架构 百度云盘下载
关于Linux的资源我了解还是比较少的,因为我最讨厌用命令行了(那是我大学时代的阴影啊!).这个资源收集很久了一直没有分享出来,因为我对Linux的了解真的很少,不知道怎么去描述,但是今天分享出来我想 ...