剑指offer 反转链表

题目描述:
输入一个链表,反转链表后,输出链表的所有元素。
(hint : 请务必使用链表)

和这道题一样。。
http://blog.csdn.net/s_h_r/article/details/50781947

#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值