双向链表结构:

定义一个如下结构体

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 ;
}

测试结果:

双向链表实现简单的list的更多相关文章

  1. 双向链表的简单Java实现-sunziren

    写在前面,csdn的那篇同名博客就是我写的,我把它现在在这边重新发布,因为我实在不想用csdn了,那边的广告太多了,还有就是那个恶心人的“阅读更多”按钮,惹不起我躲得起. 在上次分享完单向链表的简单编 ...

  2. JAVA单向/双向链表的实现

    一.JAVA单向链表的操作(增加节点.查找节点.删除节点) class Link { // 链表类 class Node { // 保存每一个节点,此处为了方便直接定义成内部类 private Str ...

  3. JAVA实现单双向链表的增、删、改、查

    单向链表 package com.ywx.link; /** * 单向链表 * @author vashon * */ public class LinkTest { public static vo ...

  4. redis 5.0.7 源码阅读——双向链表

    redis中双向链表相关的文件为:adlist.h与adlist.c 一.数据结构 redis里定义的双向链表,与普通双向链表大致相同 单个节点: typedef struct listNode { ...

  5. 深度分析:Redis 的数据结构及其使用场景分析,原来这么简单?

    Redis基础数据结构有哪些? 一.String(字符串) 在任何一种编程语言里,字符串String都是最基础的数据结构, 那你有想过Redis中存储一个字符串都进行了哪些操作嘛? 在Redis中St ...

  6. java之数据结构

    数据结构有什么用? 现实世界的存储,我们使用的工具和建模.每种数据结构有自己的优点和缺点,想想如果Google的数据用的是数组的存储,我们还能方便地查询到所需要的数据吗?而算法,在这么多的数据中如何做 ...

  7. 一口气说出Redis 5种数据结构及对应使用场景,面试要加分的

    整理了一些Java方面的架构.面试资料(微服务.集群.分布式.中间件等),有需要的小伙伴可以关注公众号[程序员内点事],无套路自行领取 更多优选 一口气说出 9种 分布式ID生成方式,面试官有点懵了 ...

  8. Redis 5种数据结构及对应使用场景

    本文案例收录在 https://github.com/chengxy-nds/Springboot-Notebook 也当过面试官,面试过不少应聘者,因为是我自己招人自己用,所以我不会看应聘者造火箭的 ...

  9. (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作

    上午写了下单向循环链表的程序,今天下午我把双向链表的程序写完了.其实双向链表和单向链表也是有很多相似的地方的,听名字可以猜到,每个节点都包含两个指针,一个指针指向上一个节点,一个指针指向下一个节点.这 ...

随机推荐

  1. Queue 消息的发送与接收(PTP 消息传递模型)

    上篇博客写到了JMS两种消息模型(P2P.pub/sub)<JMS两种消息模型>.本篇博客通过一个实例来进一步了解P2P模型. Queue消息的发送与接收--PTP消息传递模型,样例: Q ...

  2. 深入 理解 Statement 和 PreparedStatement

    一.使用Statement而不是PreparedStatement对象 JDBC驱动的最佳化是基于使用的是什么功能. 选择PreparedStatement还是Statement取决于你要怎么使用它们 ...

  3. Flume+LOG4J+Kafka

    基于Flume+LOG4J+Kafka的日志采集架构方案 本文将会介绍如何使用 Flume.log4j.Kafka进行规范的日志采集. Flume 基本概念 Flume是一个完善.强大的日志采集工具, ...

  4. 开启程序的Visual Styles

    首先看看MS对Visual Styles的解释: Windows XP and later operating systems support a feature called visual styl ...

  5. Facial Landmark Detection

    源地址:http://www.learnopencv.com/facial-landmark-detection/#comment-2471797375 OCTOBER 18, 2015 BY SAT ...

  6. div仿checkbox表单样式美化及功能

    div仿checkbox表单样式美化及功能(checkbox的样式不好看)素材在底部: 效果图: window.css .bj { position: absolute; top: 0; left: ...

  7. 分布式发布订阅消息系统Kafka

    高吞吐量的分布式发布订阅消息系统Kafka--安装及测试   一.Kafka概述 Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据. 这种动作(网页浏览, ...

  8. python 学习笔记 10 -- 正則表達式

    零.引言 在<Dive into Python>(深入python)中,第七章介绍正則表達式,开篇非常好的引出了正則表達式,以下借用一下:我们都知道python中字符串也有比較简单的方法, ...

  9. VSTO之旅系列(五):创建Outlook解决方案

    原文:VSTO之旅系列(五):创建Outlook解决方案 本专题概要 引言 Outlook对象模型 自定义Outlook窗体 小结 一.引言 在上一个专题中,为大家简单介绍了下如何创建Word解决方案 ...

  10. hdu1565+hdu1569(最大点权独立集)

    传送门:hdu1565 方格取数(1) 传送门:hdu1569 方格取数(2) 定理:1. 最小点权覆盖集=最小割=最大流2. 最大点权独立集=总权-最小点权覆盖集 步骤: 1. 先染色,取一个点染白 ...