双向链表实现简单的list
双向链表结构:


定义一个如下结构体
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的更多相关文章
- 双向链表的简单Java实现-sunziren
写在前面,csdn的那篇同名博客就是我写的,我把它现在在这边重新发布,因为我实在不想用csdn了,那边的广告太多了,还有就是那个恶心人的“阅读更多”按钮,惹不起我躲得起. 在上次分享完单向链表的简单编 ...
- JAVA单向/双向链表的实现
一.JAVA单向链表的操作(增加节点.查找节点.删除节点) class Link { // 链表类 class Node { // 保存每一个节点,此处为了方便直接定义成内部类 private Str ...
- JAVA实现单双向链表的增、删、改、查
单向链表 package com.ywx.link; /** * 单向链表 * @author vashon * */ public class LinkTest { public static vo ...
- redis 5.0.7 源码阅读——双向链表
redis中双向链表相关的文件为:adlist.h与adlist.c 一.数据结构 redis里定义的双向链表,与普通双向链表大致相同 单个节点: typedef struct listNode { ...
- 深度分析:Redis 的数据结构及其使用场景分析,原来这么简单?
Redis基础数据结构有哪些? 一.String(字符串) 在任何一种编程语言里,字符串String都是最基础的数据结构, 那你有想过Redis中存储一个字符串都进行了哪些操作嘛? 在Redis中St ...
- java之数据结构
数据结构有什么用? 现实世界的存储,我们使用的工具和建模.每种数据结构有自己的优点和缺点,想想如果Google的数据用的是数组的存储,我们还能方便地查询到所需要的数据吗?而算法,在这么多的数据中如何做 ...
- 一口气说出Redis 5种数据结构及对应使用场景,面试要加分的
整理了一些Java方面的架构.面试资料(微服务.集群.分布式.中间件等),有需要的小伙伴可以关注公众号[程序员内点事],无套路自行领取 更多优选 一口气说出 9种 分布式ID生成方式,面试官有点懵了 ...
- Redis 5种数据结构及对应使用场景
本文案例收录在 https://github.com/chengxy-nds/Springboot-Notebook 也当过面试官,面试过不少应聘者,因为是我自己招人自己用,所以我不会看应聘者造火箭的 ...
- (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作
上午写了下单向循环链表的程序,今天下午我把双向链表的程序写完了.其实双向链表和单向链表也是有很多相似的地方的,听名字可以猜到,每个节点都包含两个指针,一个指针指向上一个节点,一个指针指向下一个节点.这 ...
随机推荐
- POJ1291-并查集/dfs
并查集 题意:找出给定的这些话中是否有冲突.若没有则最多有多少句是对的. /* 思路:如果第x句说y是对的,则x,y必定是一起的,x+n,y+n是一起的:反之x,y+n//y,x+n是一起的. 利用并 ...
- hibernate学习(二)
hibernate 单向一对多映射 一.数据表设计 数据库名:hibernate5 数据表: ①表名:CUSTOMERS 字段: CUSTOMER_ID CUSTOMER_NAME ②表名:ORDE ...
- mysql 高可用方案MHA介绍
概述 MHA是一位日本MySQL大牛用Perl写的一套MySQL故障切换方案,来保证数据库系统的高可用.在宕机的时间内(通常10—30秒内),完成故障切换,部署MHA,可避免主从一致性问题,节约购买新 ...
- Android大图片导致内存问题小结
在网上看了部分Android中OOM的问题,现在根据理解,做一下笔记. Android OOM 产生的几种原因 1. 程序中使用了太多自己创建的Bitmap. 这种情况通常是最好解决的. 因为你明白你 ...
- Qt笔记——MOC(莫克)
moc 代表 Meta-Object Compiler,"元对象编译器".Qt 程序在交由标准编译器编译之前,先要使用 moc 分析 C++ 源文件. 假设它发如今一个头文件里包括 ...
- .net设计模式 - 单例模式
DoNet设计模式实例之单例模式( Singleton Pattern) 一 : 单例模式的简介:(Brief Introduction) 单例模式(Singleton Pattern),保证一个类只 ...
- Codeforces Round #246 (Div. 2) D. Prefixes and Suffixes(后缀数组orKMP)
D. Prefixes and Suffixes time limit per test 1 second memory limit per test 256 megabytes input stan ...
- HDU 4815 背包
标题的含义给出N问题.和概率P,然后给予相应的分数为每个问题x(每个问题只有两种选择,纠正错误). 两个人来回答.一个人是随机选择的答案,问:还有一个人的至少一些点的能力有保证P概率不会失败. 01背 ...
- pig中使用的一些实例语法
在pig中, dump和store会分别完毕两个MR, 不会一起进行 1:载入名用正則表達式: LOAD '/user/wizad/data/wizad/raw/2014-0{6,7-0,7-1,7- ...
- windows之实现3D立体效果的三种方法
第一种:快捷键:win+tab 另外一种:cmd输入rundll32.exe dwmapi #105 第三种:使用软件bumptop