c++反转list样例代码

c++链表反转是一个比较考验基本功的题目。实现方法也有很多种。

本例是使用了递归的方法实现。

思路如下:
假设一个链表有三个元素 A B C

链表样例.PNG

那么反转可以按如下步骤

  1. 把尾部B->C改为C->B


    第一次尾部变换.PNG
  2. 把变换后的尾部A->B改为B->A,完成整个链表反转


    第二次尾部变换.PNG

经过两次变换后,整个链表实现了反转。

如果链表节点增加呢,可以同理按照如上步骤操作。只不过是重复尾部反转而已。那么这个操作可以用递归来实现。具体实现代码如下,供参考。

#include <iostream>

using namespace std;

struct node_t {
    int val;
    node_t *next;
};

#define LIST_DEMO_NODE_COUNT 5
struct node_t * create_list_demo() {
    struct node_t *head = nullptr;
    int n = 0;
    while (n++ < LIST_DEMO_NODE_COUNT) {
        struct node_t *node = new struct node_t();
        node->val = n;
        node->next = nullptr;

        if (head == nullptr) {
            head = node;
        } else {
            struct node_t *p = head;
            while (p->next) p = p->next;

            p->next = node;
        }
    }
    return head;
}

void destroy_list_demo(struct node_t * head) {
    struct node_t * p = head;
    struct node_t * q = p;
    while(p) {
        q = p;
        p = p->next;

        delete q;
    }
}

void print_list_demo(struct node_t * head) {
    struct node_t *p = head;
    while (p) {
        cout << p->val << "  ";
        p = p->next;
    }
    cout << endl;
}

void reverse_last_two(struct node_t * tail_prev, struct node_t * tail) {
    tail->next = tail_prev;
    tail_prev->next = nullptr;
}

void find_tail(struct node_t * head, struct node_t * &tail_prev, struct node_t * &tail) {
    tail = head;
    tail_prev = tail;
    while (tail->next) {
        tail_prev = tail;
        tail = tail->next;
    }
}

struct node_t * reverse_list_demo(struct node_t * head) {
    struct node_t * tail_prev = nullptr;
    struct node_t * tail= nullptr;
    find_tail(head, tail_prev, tail);
    struct node_t * reversed_head =tail;

    while(tail != head) {
        reverse_last_two(tail_prev, tail);
        find_tail(head, tail_prev, tail);
    }

    return reversed_head;
}

int main() {
    struct node_t *g_head = nullptr;

    cout << "reverse list demo" << endl;
    g_head = create_list_demo();
    print_list_demo(g_head);

    g_head = reverse_list_demo(g_head);
    print_list_demo(g_head);

    destroy_list_demo(g_head);
    return 0;
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 专业考题类型管理运行工作负责人一般作业考题内容选项A选项B选项C选项D选项E选项F正确答案 变电单选GYSZ本规程...
    小白兔去钓鱼阅读 9,058评论 0 13
  • 一:记忆那怕遗忘,心会记得 我一直是日本动漫的狂热爱好者,首先在一瞬间就被新海诚导演的这部电影的画面所吸引,超美。...
    柔软的刺猬77阅读 207评论 0 1
  • 邻居家的阿姨因为乳腺癌去世了,这是今年第二个去世的邻居。 生命有时候真是脆弱地可怕,没有一点商量的余地。 有时候,...
    辛西娅淼阅读 103评论 0 0
  • 今天我们当地组织了一场国际马拉松比赛,虽然是第一届,但准备的非常充分,后勤保障也很到位。 今天的天气也很给力,最高...
    处处1阅读 11,172评论 5 3
  • 天,灰蒙蒙,沉闷直逼得人喘不过气来。天空乌云密布,好似一只乌灰的大手从天掩盖下来。树木呆立不动,没有一丝风。树上的...
    孤独一刀阅读 907评论 42 30