双向链表结构:

定义一个如下结构体

struct Node
{
Object data;
Node *next;
Node *prev;
};

下面为list的具体实现:

#include <iostream>
using namespace std; template <typename Object>
class List
{
private:
//链表结点的定义
struct Node
{
Object data;
Node *next;
Node *prev; Node(const Object &d = Object(), Node *p = nullptr, Node *n = nullptr)
:data(d), next(n), prev(p){}
};
private:
int theSize;
Node *head;
Node *tail; void init()
{
theSize = ;
head = new Node;
tail = new Node;
head->next = tail;
tail->prev = head;
}
public:
class const_iterator
{
public:
const_iterator() :current(nullptr)
{} 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 retrieve();
} const Object & operator* () const
{
return const_iterator::operator*();
} iterator &operator++ ()
{
current = 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(const List &rhs)
{
init();
*this = rhs;
} ~List()
{
clear();
delete head;
delete tail;
} //重载操作符=
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++;
Node *newNode = new Node(x, p->prev, p);
p->prev = p->prev->next = newNode;
return iterator(newNode);
} 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;
}
}; int main()
{
List<int> test;
test.push_back();
test.push_back();
test.push_back();
test.push_front();
for (List<int>::iterator itr = test.begin(); itr != test.end();itr++)
{
cout << *itr << ' ';
}
return ;
}

测试结果:

最新文章

  1. [LeetCode] Sum of Left Leaves 左子叶之和
  2. Premiere使用整理
  3. Fix failed to start session in Ubuntu
  4. 外网主机访问虚拟机下的web服务器(NAT端口转发)
  5. Happy Number - LeetCode
  6. 【一起学OpenFOAM】04 OpenFOAM的学习资源
  7. Skew Join与Left Semi Join相关
  8. ubuntu texlive 中文的配置方法
  9. 浅谈 IE下innerHTML导致的问题
  10. 用Python最原始的函数模拟eval函数的浮点数运算功能
  11. Spark学习之Spark调优与调试(二)
  12. [转]Red Hat Linux相关产品iso镜像下载【百度云】
  13. oracle查询A表中主键都被哪些表引用了?
  14. Codeforces D - High Load
  15. leetCode题解之反转二叉树
  16. ctci1.2
  17. java代码--------编写0懂啊PI之间求随机数的方法
  18. Java中的volatile关键字的功能
  19. HDU - 5327 Olympiad(一维前缀和)
  20. JQuery 判断滚动条是否到底部

热门文章

  1. WM_SYSCOMMAND消息命令整理 good
  2. 使用Ajax以及Jquery.form异步上传图片
  3. 佳文分享:CAP定理
  4. Python多线程2:sched
  5. Delphi 基本数据类型列表 高级数据类型列表 字符类型查询列表清单
  6. hdu2606(递推)
  7. 陈一舟《情系人人》:先搞钱,再搞人才_DoNews-IT门户-移动互联网新闻-电子商务新闻-游戏新闻-风险投资新闻-IT社交网络社区
  8. 怎样改动SVN的地址
  9. UC高级编程--实现myls程序
  10. 【转向Javascript系列】深入理解Web Worker