【C++】list列表容器的每相邻两个元素顺序颠倒

list<int> l;
for (int i = 0; i < 10; i++) {
    int x;
    cin >> x;
    l.push_front(x);
}

//将列表容器l的每相邻两个元素顺序颠倒
list<int>::iterator iter = l.begin();/*l.begin()返回的是指向l首元素地址的迭代器并将其赋值给iter,所以iter也要是迭代器,所以初始化iter前面要加“list<int>::iterator”*/
while (iter != l.end()) {
    int v = *iter;          //得到一个元素
    iter = l.erase(iter);   /*将该元素删除,并得到指向下一个元素的迭代器,因为list是链表容器,所以删除一个节点,相当于节点后面的节点全部“前移”*/
    l.insert(++iter, v);//将刚刚删除的元素(节点)插入下一个位置,返回的是指向插入节点后的节点的迭代器
}

生成list容器对象l,然后对l的每相邻两个元素顺序颠倒,比如原来l中的元素是“1 2 3 4 5 6 7 8 9 10”,颠倒之后是“2 1 4 3 6 5 8 7 10 9”。

一步步对while循环进行分析:

  写在前面:list是链表容器!一开始笔者把list以为成数组容器,所以对代码百思不得其解。链表的特点是节点与节点之间不是物理内存上的连续储存,节点之间以指针相联系,所以在顺序颠倒的操作中,可以自如地删除节点、插入节点。

  l.end()返回的是指向l最后节点之后的迭代器;

  l.erase(iter)指删除iter指向的节点,并将下一个节点的地址返回,例如一开始删除数据为1的节点,返回数据为2的节点的地址;

  iter = l.erase(iter),将数据为2的节点的地址赋给iter;

  l.insert(++iter, v)指用v初始化一个新节点,并插入到++iter指向的节点之前,即数据为3的节点之前。并将(已插入的节点的)下一个节点的地址返回,即返回的是数据为3的节点的地址;

  因为返回的是数据为3的节点的地址,所以while循环便可以顺利进行下去。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • STL部分 1.STL为什么广泛被使用 C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vec...
    杰伦哎呦哎呦阅读 4,349评论 0 9
  • STL(标准模板库),是目前C++内置支持的library。它的底层利用了C++类模板和函数模板的机制,由三大部分...
    岁与禾阅读 39,187评论 3 132
  • 顺序容器概述 C++标准库中的顺序容器为程序员提供了控制元素存储和顺序访问元素的能力,包括vector,strin...
    土豆吞噬者阅读 632评论 0 0
  • 写在前面的话 代码中的# > 表示的是输出结果 输入 使用input()函数 用法 注意input函数输出的均是字...
    FlyingLittlePG阅读 2,978评论 0 9
  • 3味中药是下火“高手”,尤其第一个最常见 生活在古代西安的人来说,夏天是一年季节里最难熬的时候,尤其在7-8月份,...
    杨黛安兮子君阅读 185评论 0 0