根据存放位置数据的链表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. 思路: 方案一:首先遍历到尾部,然后从尾部进行到头值进行操作,后进先 ...
随机推荐
- 初学java之触发响应事件
import java.awt.*; import javax.swing.*; import java.awt.event.*; class WindowActionEvent extends JF ...
- Spring配置文件解析--依赖注入
1.构造器注入基于构造器的DI通过调用带参数的构造器来实现,每个参数代表着一个依赖.此外,还可通过给stattic工厂方法传参数来构造bean.构造器参数解析根据参数类型进行匹配,如果bean的构造器 ...
- windows下修改mysql用户名和密码
1.关闭正在运行的MySQL. 2.打开DOS窗口,转到mysql\bin目录. 3.输入mysqld-nt --skip-grant-tables回车.如果没有出现提示信息,那就对了. 4.再开一个 ...
- Rudolph javascript 监听简单对象属性的变化 -- 回调函数的应用
http://www.oschina.net/code/snippet_1590754_46481 //简单对象的属性的变化监控 //通过setAttr改变属性的值 var o = { 'a':2, ...
- Excel VBA记录
-----------快捷键---------- 函数等提示(默认):ctrl+j 注释:上单引号' 设置单元格为空可以用:empty/null -----------基础语法--------- 基本 ...
- PMP 项目管理
1.什么是项目管理 项目管理就是把各种知识,技能,工具,技术应用于项目活动,来满足项目的需求.这个是从技术方面来说的.其实在项目管理的技术 层面背后,还有理念层面的内容.学习项目管理,除了学习技术 ...
- CSS从今以后不用发愁
Bootstrap 简洁.直观.强悍的前端开发框架,让web开发更迅速.简单. Bootstrap3中文文档 Bootstrap2中文文档 http://www.bootcss.com/
- warning malformed '#pragma pack(push[, id], n)' - ignored
bmp.c:8: warning: malformed '#pragma pack(push[, id], <n>)' - ignored bmp.c:33: warning: #prag ...
- html中offsetTop、clientTop、scrollTop、offsetTop
HTML精确定位:scrollLeft,scrollWidth,clientWidth,offsetWidth scrollHeight: 获取对象的滚动高度. scrollLeft:设置或获取位于对 ...
- win10 ctrl + 空格 热键取消
关键:添加English,并上移到第一,即开机默认即可.Win8+不用修改注册表的,只有win7里才可能需要修改注册表. http://superuser.com/questions/327479/c ...