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

203.移除链表元素

"pre" 和 "cur" 是常用的变量名;"pre" 指的是上一次循环的元素,而 "cur" 指的是当前循环的元素

 使用原链表方式移除

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        // 删除头结点 使用原链表方式
        while (head != NULL && head->val == val) {
            ListNode* temp = head; // C++需要手动清理移除的元素所占内存
            head = head->next;
            delete temp;
        }

        // 删除非头结点
        ListNode* cur = head;
        while (cur != NULL && cur->next != NULL) { // 需要删除操作的指针不能为空
            if (cur->next->val == val) {
                ListNode* temp = cur->next;
                cur->next = cur->next->next;
                delete temp;
            } else {
                cur = cur->next; // 更新指针完成遍历
            }
        }
        return head;
    }
};

 虚拟头结点

ListNode* dummyHead = new ListNode(0); // 设置一个虚拟头结点
class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        ListNode* dummyHead = new ListNode(0); // 设置一个虚拟头结点
        dummyHead->next = head;
        ListNode* cur = dummyHead; // 若不使用临时节点,头结点在遍历中不断变化,最后无法返回正确头结点
        while (cur->next != NULL) {//要删除cur->next->val cur->next不能是空指针
            if (cur->next->val == val) {
                ListNode* temp = cur->next;
                cur->next = cur->next->next;
                delete temp;
            } else {
                cur = cur->next;
            }
        }
        head = dummyHead->next;
        delete dummyHead;
        return head; // 返回头结点时要注意 原head头结点可能已被删除
                     // 应返回dummyHead->next才是新的头结点
    }
};

707.设计链表

节点数从0开始

三个Listnode构造函数
        Listnode():val(0),next(nullptr){}                         //参数为空
        Listnode(int v):val(v),next(nullptr){}                   //一个参数
        Listnode(int v,Listnode* n):val(v),next(n){}        //两个参数

学习如何定义链表结构体

/ 定义链表节点结构体
    struct LinkedNode {
        int val;
        LinkedNode* next;
        LinkedNode(int val):val(val), next(nullptr){}
    };

    // 初始化链表
    MyLinkedList() {
        _dummyHead = new LinkedNode(0); // 这里定义的头结点 是一个虚拟头结点,而不是真正的链表头结点
        _size = 0;
    }
class MyLinkedList {
public:
    struct LinkedNode {
        int val;
        LinkedNode* next;
        LinkedNode(int val) : val(val), next(nullptr) {}
    };

    MyLinkedList() {
        size = 0;
        dummyhead = new LinkedNode(0);
    }

    int get(int index) {
        LinkedNode* cur = dummyhead->next;
        if (index < 0 || index > size - 1)
            return -1;
        while (index--) {
            cur = cur->next;
        }
        return cur->val;
    }

    void addAtHead(int val) {
        LinkedNode* newNode = new LinkedNode(val);
        newNode->next = dummyhead->next;
        dummyhead->next = newNode;
        size++;
    }

    void addAtTail(int val) {
        LinkedNode* newNode = new LinkedNode(val);
        LinkedNode* cur = dummyhead;
        while (cur->next != NULL) { // 不为空指针时遍历链表
            cur = cur->next;
        }
        cur->next = newNode;
        size++;
    }

    void addAtIndex(int index, int val) {
        if (index > size)
            return;
        if (index < 0)
            index = 0;
        LinkedNode* newNode = new LinkedNode(val);
        LinkedNode* cur = dummyhead;
        while (index--) {
            cur = cur->next;
        }
        newNode->next = cur->next;
        cur->next = newNode;
        size++;
    }

    void deleteAtIndex(int index) {
        LinkedNode* cur = dummyhead;
        if (index > size - 1 || index < 0)
            return;
        while (index--) {
            cur = cur->next;
        }
        LinkedNode* temp = cur->next;
        cur->next = cur->next->next;
        delete temp;
    }

private:
    int size;
    LinkedNode* dummyhead;
};

206.反转链表

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode* pre = NULL;
        ListNode* cur = head;
        ListNode* temp;
        while (cur) {
            temp = cur->next;
            cur->next = pre;
            pre = cur;
            cur = temp;
        }
        return pre;
    }
};

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值