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

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

//将列表容器l的每相邻两个元素顺序颠倒
list::iterator iter = l.begin();/*l.begin()返回的是指向l首元素地址的迭代器并将其赋值给iter,所以iter也要是迭代器,所以初始化iter前面要加“list::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循环便可以顺利进行下去。

你可能感兴趣的:(【C++】list列表容器的每相邻两个元素顺序颠倒)