例题:C++中删除链表中的奇数元素
2017-03-17 09:30
387 查看
C++中表示链表的容器是forward_list。
首先给链表赋一个初始值,用列表初始化的方法:forward_list lst{1,2,3,4,5,6,7};
删除链表中元素的语句是erase_after。如lst.erase_after(iter),iter是一个迭代器,和erase语句不同的是,erase删除的是这个迭代器所指元素,而erase_after删除的是迭代器所指后面的那个元素。
判断一个数是否为奇数用的是指向这个数的迭代器,但我们只能删除这个迭代器之后的元素。怎么办呢?c++还提供了before_begin(),它指的位置是第一个元素之前的位置,和end()感觉差不多。假如我们判断出来了第一个元素是奇数,要删除它,那么就:auto it = lst.before_begin();再lst.erase_after(it);按照这个思路类推。
整体流程大概是:从链表最开始,我们需要两个迭代器,一个指着第一个元素,叫做iter。一个指向第一个元素之前的元素,叫做iter_begin。我们使用iter依次判断每个元素是否是奇数,直到到达end为止。
如果是奇数,那么就erase_after(iter_begin)。然后要移动迭代器的位置使它们接着判断。erase_after返回了被删除元素的下一个位置,所以我们要让iter等于它,也就是iter = lst.erase_after(iter_begin)。我们不需要移动iter_begin的位置。
如果不是奇数,就要移动两个迭代器继续判断。iter_begin和iter都++。
这是大体思路。
我的代码如下:
#include <iostream>
#include <forward_list>
using namespace std;
int main()
{
forward_list<int> lst{1,2,3,4,5,6};
auto iter_begin = lst.before_begin();
auto iter = lst.begin();
while (iter != lst.end())
{
if(*iter%2==1)
{
iter=lst.erase_after(iter_begin);
}
else
{
iter_begin++;
iter++;
}
}
for (auto it : lst)
cout << it << endl;
system("pause");
return 0;
}
首先给链表赋一个初始值,用列表初始化的方法:forward_list lst{1,2,3,4,5,6,7};
删除链表中元素的语句是erase_after。如lst.erase_after(iter),iter是一个迭代器,和erase语句不同的是,erase删除的是这个迭代器所指元素,而erase_after删除的是迭代器所指后面的那个元素。
判断一个数是否为奇数用的是指向这个数的迭代器,但我们只能删除这个迭代器之后的元素。怎么办呢?c++还提供了before_begin(),它指的位置是第一个元素之前的位置,和end()感觉差不多。假如我们判断出来了第一个元素是奇数,要删除它,那么就:auto it = lst.before_begin();再lst.erase_after(it);按照这个思路类推。
整体流程大概是:从链表最开始,我们需要两个迭代器,一个指着第一个元素,叫做iter。一个指向第一个元素之前的元素,叫做iter_begin。我们使用iter依次判断每个元素是否是奇数,直到到达end为止。
如果是奇数,那么就erase_after(iter_begin)。然后要移动迭代器的位置使它们接着判断。erase_after返回了被删除元素的下一个位置,所以我们要让iter等于它,也就是iter = lst.erase_after(iter_begin)。我们不需要移动iter_begin的位置。
如果不是奇数,就要移动两个迭代器继续判断。iter_begin和iter都++。
这是大体思路。
我的代码如下:
#include <iostream>
#include <forward_list>
using namespace std;
int main()
{
forward_list<int> lst{1,2,3,4,5,6};
auto iter_begin = lst.before_begin();
auto iter = lst.begin();
while (iter != lst.end())
{
if(*iter%2==1)
{
iter=lst.erase_after(iter_begin);
}
else
{
iter_begin++;
iter++;
}
}
for (auto it : lst)
cout << it << endl;
system("pause");
return 0;
}
相关文章推荐
- 数据结构实验之链表七:单链表中重复元素的删除 c++练习
- C++单链表中删除指定范围内的元素
- C++单链表中删除指定范围内的元素
- 删除链表中的元素 - C++
- C++单链表中删除指定范围内的元素
- LintCode 452.删除链表中的元素 C++
- C++单链表中删除指定范围内的元素
- C++单链表中删除指定范围内的元素
- C++单链表中删除指定范围内的元素
- C++单链表中删除指定范围内的元素
- 112. 删除排序链表中的重复元素(remove-duplicates-from-sorted-list)(c++)----lintcode面试题之链表
- [C++]Remove Linked List Elements 删除链表中的元素
- C++单链表中删除指定范围内的元素
- C++单链表中删除指定范围内的元素
- C++单链表中删除指定范围内的元素
- C++单链表中删除指定范围内的元素
- C++单链表中删除指定范围内的元素
- C++单链表中删除指定范围内的元素
- C++单链表中删除指定范围内的元素
- 删除链表中的元素 - C++