代码随想录算法训练营第三天 | 203.移除链表元素,707.设计链表,206.反转链表

day3

203.移除链表元素

/**
 * Definition for singly-linked list.
 * 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) {}
 * };
 */
class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        if (head == nullptr) return head;
        ListNode *p = new ListNode();  // 前一个节点
        p->next = head;
        ListNode *q = head; // 后一个节点
        head = p;
        while(q != nullptr) {
            if (q->val == val) {
                p->next = q->next;
                delete q;
                q = p->next;
                continue;
            }
            p = p->next;
            q = q->next;
        }
        p = head->next;
        delete head;  // 释放内存
        return p;
    }
};

707.设计链表

/**
 * Definition for singly-linked list.
 * 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) {}
 * };
 */
class MyLinkedList {
public:
    MyLinkedList() {
        head = new ListNode();
        head->next = nullptr;
        length = 0;
    }
    ~MyLinkedList() {
        ListNode* q = head;
        ListNode* p = head->next;
        for (int i = 0; i < length; ++i) {
           q->next = p->next;
           delete p;
           p = q->next;
        }
        delete head;
    }

    int get(int index) {
        if (index > (length - 1)) {
            return -1;
        }
        ListNode* p = head->next;
        for (int i = 0; i < index; i++) {
            p = p->next;
        }
        return p->val;
    }

    void addAtHead(int val) {
        ListNode* p = new ListNode(val);
        p->next = head->next;
        head->next = p;
        length++;
    }

    void addAtTail(int val) {  // 0 1 
        ListNode* p = head;
        for (int i = 0; i < length; ++i) {
            p = p->next;
        }
        ListNode* q = new ListNode(val);
        p->next = q;
        length++;
    }

    void addAtIndex(int index, int val) {
        if (index > length) return;
        if (index == length) {
            addAtTail(val);
            return;
        }
        if (index < 0) {
            addAtHead(val);
            return;
        }
        ListNode* p = head;
        for (int i = 0; i < index; i++) {
            p = p->next;
        }
        ListNode* q = new ListNode(val);
        q->next = p->next;
        p->next = q;
        length++;
    }
    // 1
    void deleteAtIndex(int index) {
        if (index > (length-1)) return;
        ListNode* p = head; // 
        for (int i = 0; i < index; i++) { // 1
            p = p->next; // 1
        }
        ListNode* q = p->next;
        p->next = q->next;
        delete q;
        length--;
    }
private:
    ListNode* head; // 头节点
    int length; // 链表长度
};
    

206.反转链表

/**
 * Definition for singly-linked list.
 * 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) {}
 * };
 */
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode *temp = new ListNode();
        ListNode *q = nullptr;
        while(head != nullptr) {
            q = head->next;
            head->next = temp->next;
            temp->next = head;
            head = q;
        }
        head = temp->next;
        delete temp;
        return head;
    }
};
posted @   MasEne  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示