Enter password:
Enter password:
Enter password:
#include < iostream >
#include < cassert >
using namespace std;
class List;
class Node{
public:
Node(int data):data(data), next(NULL), previous(NULL) {}
private:
int data;
Node* next;
Node* previous;
friend class Iterator;
friend class List;
};
class Iterator{
public:
Iterator(): position(NULL), container(NULL) {}
int get() const{
assert(position != NULL);
return position->data;
}
void next(){
assert(position != NULL);
position = position->next;
}
bool equals(Iterator iter){
return position == iter.position;
}
private:
Node* position;
List* container;
friend class List;
};
class List{
public:
List(): first(NULL), last(NULL) {}
void push_back(int data){
if(first == NULL) // when there is no node in the list
{
Node* new_node = new Node(data);
first = new_node;
last = new_node;
return;
}
Node* new_node = new Node(data);
last->next = new_node;
new_node->previous = last;
last = new_node;
}
void insert(Iterator iter, int data){
if(iter.position == NULL){
push_back(data);
return;
}
Node* new_node = new Node(data);
if(iter.position == first){
new_node->next = first;
first->previous= new_node;
first = new_node;
return;
}
Node* after = iter.position;
Node* before = iter.position->previous;
new_node->next = after;
new_node->previous = before;
after->previous = new_node;
before->next = new_node;
}
void remove(Iterator iter){
if(iter.position == NULL){
return;
}
if(iter.position == first){
Node* next_node = first->next;
delete first;
first = next_node;
return;
}
if(iter.position == last){
Node* prev_node = last->previous;
delete last;
last = prev_node;
return;
}
Node* current= iter.position;
Node* after = iter.position->next;
Node* before= iter.position->previous;
before->next = after;
after->previous = before;
delete current;
}
void reverse(){
Node* tmp_first = first;
Node* tmp_last = last;
Iterator iter;
iter = begin();
while(iter.equals(end()) == false){
Node* some_node = iter.position;
Node* tmp_next = some_node->next;
some_node->next = some_node->previous;
some_node->previous = tmp_next;
iter.position = iter.position->previous;
}
first = tmp_last;
last = tmp_first;
}
Iterator begin(){
Iterator iter;
iter.position = first;
iter.container= this;
return iter;
}
Iterator end(){
Iterator iter;
iter.position = NULL;
iter.container= this;
return iter;
}
private:
Node* first;
Node* last;
friend class Iterator;
};
int main(){
List v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.reverse();
Iterator iter;
for(iter = v.begin(); iter.equals(v.end()) == false; iter.next()){
cout << iter.get() << endl;
}
}
Enter password:
class List{
public:
// ... Member functions of List ...
void reverse(){
Node* tmp_first = first;
Node* tmp_last = last;
Iterator iter;
iter = begin();
while(iter.equals(end()) == false){
Node* some_node = iter.position;
Node* tmp_next = some_node->next;
some_node->next = some_node->previous;
some_node->previous = tmp_next;
iter.position = iter.position->previous;
}
first = tmp_last;
last = tmp_first;
}
private:
Node* first;
Node* last;
friend class Iterator;
};
class List{
public:
// ... Member functions of List ...
void push_front(int data){
size ++;
// no item in the list
if(first == NULL){
Node* new_node = new Node(data);
first = new_node;
last = new_node;
return;
}
// at least one item in the list
Node* new_node = new Node(data);
first->previous = new_node;
new_node->next = first;
first = new_node;
}
private:
Node* first;
Node* last;
friend class Iterator;
};
class List{
public:
// ... Member functions of List ...
void swap(List& other){
// TODO
// swap first and first
// swap last and last
Node* original_first = first;
Node* original_last = last;
int orignal_size = size;
first = other.first;
last = other.last;
size = other.size;
other.first = original_first;
other.last = original_last;
other.size = orignal_size;
}
private:
Node* first;
Node* last;
friend class Iterator;
};
class List{
public:
// ... Member functions of List ...
int get_size(){
int count = 0;
Iterator iter;
for(iter = begin(); iter.equals(end()) == false; iter.next()){
count ++;
}
return count;
}
private:
Node* first;
Node* last;
friend class Iterator;
};