数据结构学习笔记——链表逆序

作为非计算机专业出身的程序员,虽然相关书籍都有看过,总是零散的阅读,没有进行过系统的学习,所以打算学习的过程中记一些笔记。

在做链表操作的时候,如果打断了链表,一般我们要使用 临时变量来记录断点。

逆序链表的操作也是一样的。

因为要逆序  所以我们要 记录链表的下一个节点(需要一个变量),改变next的指向(新的next 需要一个变量),要移动链表节点(可以不需要)。

所以步骤就是:

记录下一个节点;

改变当前节点的next指向  新的next (prev);

移动新的next(也就是prev)便于下一轮新节点调整next;

移动当前节点。

#include <iostream>
#include <memory>
using std::shared_ptr;
struct ListNode {
    ListNode(): next(nullptr), data(0) {
    }
    ~ListNode() {
        std::cout << "destructor called " << std::endl;
    }
    shared_ptr<ListNode> next;
    int        data;
};
shared_ptr<ListNode> createList(int len) {
    shared_ptr<ListNode> head(nullptr);
    for (int i = 0; i < len; ++i) {
        shared_ptr<ListNode> node = std::make_shared<ListNode>();
        node->data = i + 1;
        node->next = head;
        head = node;
    }
    return head;
}
void reverseList(shared_ptr<ListNode> & head) {
    shared_ptr<ListNode> prev(nullptr), next(nullptr);
    while (nullptr != head) {
        next = head->next;
        head->next = prev;
        prev = head;
        head = next;
    }
    head = prev;
}
void printList(shared_ptr<ListNode> list) {
    while (list) {
        std::cout << list->data << " ";
        list = list->next;
    }
    std::cout << std::endl;
}
int main(int argc, char** argv) {
    shared_ptr<ListNode> list = createList(10);
    printList(list);
    reverseList(list);
    printList(list);
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章