状态:链表这部分写过很多次了,初见AC。注意C/C++的话要手动delete被删除的节点。
没什么好说的,注意一下手写链表数据结构。
struct ListNode{
int _val; // 节点存储的值
ListNode* _next; // 单链表节点指针
ListNode(): _val(0), _next(nullptr) {} // 默认构造函数
ListNode(int x): _val(x), _next(nullptr) {} // 构造函数
ListNode(int x, ListNode* next): _val(x), _next(next) {}
};
状态:没有把链表节点的数据结构写出来,把链表和链表节点弄混淆了。查看思路后编写,由于细节问题没有通过,排查后AC。
两个细节:1. 初始化的时候不要重复定义;2. 按照索引添加节点时,索引为链表长度可以直接调用尾插方法。
这里复习一下等号运算符重载的形式(和题目无关):
#include <iostream>
class MyClass {
public:
int value;
// 构造函数
MyClass(int val) : value(val) {}
// 等号重载函数
MyClass& operator=(const MyClass& other) {
value = other.value;
return *this;
}
};
int main() {
MyClass obj1(10);
MyClass obj2(20);
obj1 = obj2; // 使用等于号重载函数进行赋值操作
std::cout << obj1.value << std::endl; // 输出 20
return 0;
}
状态:初见没有AC,没有注意到pre的细节,当成dummyHead设置了。调整后AC,迭代方法没实现出来,需要练习。
//迭代,注意pre指针的初始值是nullptr。
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* pre = nullptr;
ListNode* cur = head;
while(cur){
ListNode* next = cur->next;
cur->next = pre;
pre = cur;
cur = next;
}
return pre;
}
};
//递归,先走到尾部,然后利用函数调用的栈特性进行原子操作。
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if(head == nullptr || head->next == nullptr){
return head;
}
ListNode* newhead = reverseList(head->next);
head->next->next = head;
head->next = nullptr;
return newhead;
}
};