算法题打卡day3 | 203.移除链表元素、707.设计链表、206.反转链表

203. 移除链表元素 - 力扣(LeetCode)

状态:链表这部分写过很多次了,初见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) {}
};

707. 设计链表 - 力扣(LeetCode) 

状态:没有把链表节点的数据结构写出来,把链表和链表节点弄混淆了。查看思路后编写,由于细节问题没有通过,排查后AC。

两个细节:1. 初始化的时候不要重复定义;2. 按照索引添加节点时,索引为链表长度可以直接调用尾插方法。

这里复习一下等号运算符重载的形式(和题目无关):

#include   
  
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;  
}

 206. 反转链表 - 力扣(LeetCode)

状态:初见没有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;
    }
};

 

你可能感兴趣的:(算法,链表,c++)