作为非计算机专业出身的程序员,虽然相关书籍都有看过,总是零散的阅读,没有进行过系统的学习,所以打算学习的过程中记一些笔记。
在做链表操作的时候,如果打断了链表,一般我们要使用 临时变量来记录断点。
逆序链表的操作也是一样的。
因为要逆序 所以我们要 记录链表的下一个节点(需要一个变量),改变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;
}