作爲非計算機專業出身的程序員,雖然相關書籍都有看過,總是零散的閱讀,沒有進行過系統的學習,所以打算學習的過程中記一些筆記。
在做鏈表操作的時候,如果打斷了鏈表,一般我們要使用 臨時變量來記錄斷點。
逆序鏈表的操作也是一樣的。
因爲要逆序 所以我們要 記錄鏈表的下一個節點(需要一個變量),改變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;
}