链表的循环删除
链表这一种数据结构很常见,拥有良好的动态操作性能,比如插入,删除,但是对于静态操作,比如随机访问不太友好,链表的访问只能通过迭代器来查找。
这次主要说明一下链表的删除,其中有两种删除方式分别为:name.erase(const_iterator __first, const_iterator __last)和name.remove(const int &__value)。
从中可以看出,erase针对的是迭代器,也就是一个地址指针,并在删除后返回迭代器的下一个,所以要注意迭代器的范围;
而remove则是删除对象是节点里对应的值value,若有多个节点的value都为删除目标,则这些节点全部都删除,所有remove是先查找,再删除,其中查找也是用到了迭代器。
下面是一个循环删除节点的程序。
class Solution { public: int LastRemaining_Solution(int n, int m) { if(n<=0) return -1; int temp=0;; list<int> L; for(int i=0;i<n;i++) L.push_back(i); while(n>1){ temp=(temp+m-1)%n; list<int>::iterator it=L.begin(); advance(it, temp); L.erase(it); n--; } return L.front(); } };
浙公网安备 33010602011771号