用递归遍历到最后一个元素,从最后一个元素开始操作。设P逆置链表的尾指针,在尾指针后面不断加入新的元素即可。
#include <iostream>
using namespace std;
struct node{
int x;
node *next;
node(int x = 0, node *next = NULL) : x(x), next(next){}
};
class lst{
public:
lst(){
head = NULL;
size = 0;
}
~lst(){
while (head->next)
{
node *p = head->next;
head->next = p->next;
delete p;
}
delete head;
size = 0;
}
void push_back(int value){
node *p = head;
if (p == NULL){
p = new node(value);
head = p;
}
else{
while (p->next){
p = p->next;
}
p->next = new node(value);
}
size++;
}
void push_front(int value){
node *p = head;
if (p == NULL){
p = new node(value);
head = p;
}
else{
p = new node(value, head->next);
p->next = head;
head = p;
}
}
void inverse(node* current, node* &p){
if (current)
{
head = current;
inverse(current->next, p);
if (p == NULL) {
p = current;
p->next = NULL;
}
else {
p->next = current;
p = current;
p->next = NULL;
}
}
}
friend ostream& operator << (ostream &out, lst &x){
node *p = x.head;
while (p){
out << p->x << ' ';
p = p->next;
}
return out;
}
node* begin(){
return head;
}
private:
node *head;
int size;
};
int main(){
lst l;
node *p = NULL;
for (int i = 0; i < 10; i++){
l.push_front(i);
}
cout << l << endl;
l.inverse(l.begin(), p);
cout << l << endl;
return 0;
}