數據結構學習筆記——鏈表逆序

作爲非計算機專業出身的程序員,雖然相關書籍都有看過,總是零散的閱讀,沒有進行過系統的學習,所以打算學習的過程中記一些筆記。

在做鏈表操作的時候,如果打斷了鏈表,一般我們要使用 臨時變量來記錄斷點。

逆序鏈表的操作也是一樣的。

因爲要逆序  所以我們要 記錄鏈表的下一個節點(需要一個變量),改變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;
}

 

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