您的位置:首页 > Web前端

剑指offer 反转链表

2016-03-12 17:43 465 查看
题目描述:

输入一个链表,反转链表后,输出链表的所有元素。

(hint : 请务必使用链表)

和这道题一样。。

/article/9006341.html

#include <cstdio>
using namespace std;

typedef struct Node{
int val;
Node *next;
Node(int val = -1) : val(val), next(NULL) {}
}*pNode;

class List{
private:
pNode Head;
pNode Tail;
void Delete_List(pNode);
pNode Recursion_Reserve();
pNode Non_Recursion_Reserve(pNode);
void Traverse(pNode);
public:
void Traverse();
void Insert_Node(int x);
List();
~List();
};

void List::Insert_Node(int x){
Node *node = new Node(x);
this->Tail->next = node;
this->Tail = node;
}

pNode List::Recursion_Reserve(){
pNode p = this->Head->next;
pNode pn = p->next;
pNode pnn = NULL;
this->Head->next = NULL;
p->next = this->Head;
while(pn){
pnn = pn->next;
pn->next = p;
p = pn;
pn = pnn;
}
return p;
}

pNode List::Non_Recursion_Reserve(pNode node){
if(node->next == NULL){
return node;
}
else{
pNode p = Non_Recursion_Reserve(node->next);
node->next->next = node;
node->next = NULL;
return p;
}
}

void List::Traverse(pNode node){
if(node && node != this->Head){
printf("%d", node->val);
if(node->next != this->Head)
printf(" ");
Traverse(node->next);
}
}

void List::Traverse(){
// Traverse(Recursion_Reserve());
Traverse(Non_Recursion_Reserve(this->Head));
}

void List::Delete_List(pNode node){
if(node){
Delete_List(node->next);
delete node;
}
}

List::List(){
Head = Tail = new Node();
}

List::~List(){
Delete_List(this->Tail);
}

int main()
{
int n;
while(scanf("%d", &n) != EOF){
List *list = new List;
int x;
for(int i = 0; i < n; i++){
scanf("%d", &x);
list->Insert_Node(x);
}
if(n == 0)
printf("NULL");
else
list->Traverse();
printf("\n");
// list->Delete_Content();
delete list;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: