将链表中的第一个元素移动到链表末尾

3
我知道std::forward_list是一个单向链表。我想知道如何将第一个元素(头部)移动到forward_list的末尾。不要复制或创建新节点!
我尝试了以下方法:
std::forward_list<int> l2 = {10,11,12};
auto beginIt = l2.begin();
beginIt = std::next(beginIt);
l2.splice_after(l2.end(),l2,l2.begin(),beginIt); 

for(int n : l2)
    std::cout << n << ' ';
std::cout << '\n';

但是它没有起作用,有没有方法可以实现这个?

@KenY-N,这里没有push_back函数。 - TigerTV.ru
但是它是相同的要求,在列表中找到最后一个元素,因为l2.end()在结尾之后。 - Ken Y-N
@KenY-N:在这种情况下,使用了相同的forward_list,而没有创建一个节点。 - TigerTV.ru
1
链接的问题是这个问题的一部分答案,因为要正确地进行移动,您需要一个指向最后一个元素的迭代器。但是,对于这个问题的适当回答应该解释为什么以及如何处理它。 - aschepler
2个回答

3

针对您的需求,splice_after 需要一个指向最后一个元素的迭代器。也就是说,需要指向 end() 之前的元素。没有一种简便的方法可以获取这个迭代器:

auto pos = l2.begin();
while(std::next(pos) != l2.end()) ++pos;

接下来,splice_after用于单个元素时要求一个指向该元素之前的迭代器。对于第一个元素,即为before_begin()

l2.splice_after(pos, l2, l2.before_begin()); 

如果我们在 splice_after 之前使用 auto before_end=l2.begin();,我们将获得最后一个元素的迭代器。因此,下次可以直接使用它而无需使用 while 循环。这就是我想要的行为。谢谢。 - TigerTV.ru

1
你可以使用rotate
std::rotate(l.begin(), std::next(l.begin()), l.end());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接