연결 리스트 뒤집기 (Reverse Linked List)
Sample
list_input.txt
txt
1 3 5 7 2 6 9 4
Source Code
Node.h
cpp
class Node
{
public:
Node *next;
int data;
// item을 data에 넣고 다음노드를 next에 넣음
Node(const int& item, Node* ptrnext = NULL);
// p를 자신의 다음 자리에 끼워넣음
void InsertAfter(Node *p);
// next를 리스트에서 제외하고 제외된 포인터를 반환
Node* DeleteAfter(void);
};
Node.cpp
cpp
#include "Node.h"
Node::Node(const int& item, Node* ptrnext)
{
data = item;
next = ptrnext;
}
void Node::InsertAfter(Node *p)
{
p->next = next;
next = p;
}
Node* Node::DeleteAfter(void)
{
Node *tempPtr = next;
if(next == NULL)
return NULL;
next = tempPtr->next;
return tempPtr;
}
main.cpp
cpp
#include "Node.h"
#include <fstream>
using namespace std;
int main(void)
{
Node* head;
Node* p=NULL;
Node* q;
Node* i;
int data;
ifstream ifile;
ifile.open("list_input.txt");
while(!ifile.eof())
{
ifile >> data; // data에 정수 하나를 넣는다
i = new Node(data,NULL); // 대입
if(p==NULL)
{
p=i;head=p;
}
else
{
p->InsertAfter(i);
p=p->next;
}
i=NULL;
} // 대입 완료
for(Node* n=head;n!=NULL;n=n->next) // 뒤집기 전 출력
{
cout << n->data << " ";
}
cout << endl;
// 뒤집기 시작
p=head;
q=NULL;
while(p)
{
i = q; // 임시로 저장한다
q = p; // 다음 링크를 대입
p = p->next; // 다다음 링크를 대입
q->next = i; // next에 이전 링크 포인터를 대입
}
head= q;
for(Node* n=head;n!=NULL;n=n->next) // 뒤집기 후 출력
{
cout << n->data << " ";
}
cout << endl;
return 0;
}