随想录二刷Day03——数组+链表

数组

6. 螺旋矩阵 II

59. 螺旋矩阵 II

思路:
从外向内一圈一圈填充数字,为了方便,将一圈切分为等长的 4 段,如下图所示:
在这里插入图片描述

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> result(n, vector<int>(n, 0));
        int loop = n / 2, cnt = 1; // loop:需要填充的圈数; cnt:当前正在填充的圈数
        if (n & 1) result[loop][loop] = n * n; // n 为奇数时中间的一个空单独填充
        int x = 0, y = 0; // 记录当前填充到哪个位置了
        int index = 1; // 当前位置应该填充的数

        while (loop--) {
            for (; x < n - cnt; x++) result[y][x] = index++; // 上一行 左-》右
            for (; y < n - cnt; y++) result[y][x] = index++; // 右一列 上-》下
            for (; x > cnt - 1; x--) result[y][x] = index++; // 下一行 右-》左
            for (; y > cnt - 1; y--) result[y][x] = index++; // 左一列 下-》上
            cnt++; // 当前填充的圈数加一
            // 填充完一圈,起始点的横纵坐标向右下移动一格
            x++;
            y++;
        }
        return result;
    }
};

链表

2. 移除链表元素

203. 移除链表元素

思路1:
需要注意头节点的值就是 val 的情况,要找到第一个值不是 val 的节点。

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        // 如果头节点就是 val 要特殊处理
        while (head) {
            if (head->val == val) head = head->next;
            else break;
        }

        ListNode* p = head;
        while (p != NULL && p->next != NULL) {
            while (p->next && p->next->val == val) p->next = p->next->next;
            p = p->next;
        }
        return head;
    }
};

思路优化:
看了卡哥的实现,发现自己的不足之处:没有将删除的节点释放

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        // 如果头节点就是 val 要特殊处理
        while (head != NULL && head->val == val) {
            ListNode* tmp = head;
            head = head->next;
            delete tmp; // 删除 tmp 地址处的节点(释放节点空间)
        }
        // val 非头节点的情况
        ListNode* cur = head;
        while (cur != NULL && cur->next != NULL) {
            if (cur->next->val == val) { // 要提前判断下一个节点的值,否则来不及
                ListNode* tmp = cur->next;
                cur->next = cur->next->next;
                delete tmp;
            } else {
                cur = cur->next;
            }
        }
        return head;
    }
};

思路2:
设置一个虚拟头节点,可以将原来的链表头节点和其余节点按同样的方法处理

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        ListNode* dummyHead = new ListNode(0);
        dummyHead->next = head;
        ListNode* cur = dummyHead;
        while (cur && cur->next) {
            if (cur->next->val == val) {
                ListNode* tmp = cur->next;
                cur->next = cur->next->next;
                delete tmp;
            } else {
                cur = cur->next;
            }
        }
        head = dummyHead->next;
        delete dummyHead;
        return head;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值