代码随想录二刷第三天 | 203.移除链表元素、707.设计链表、206.反转链表

203.移除链表元素

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

题解:代码随想录 (programmercarl.com)

状态:AC

思路

关键条件:返回新的头节点

注意:要注意只有cur.next.val != val时才移动,否则[7,7,7,7]移除7就会剩下[7,7]

代码

时间复杂度:O(n) 空间复杂度:O(1)

java 复制代码
class Solution {
    public ListNode removeElements(ListNode head, int val) {
        ListNode dummy = new ListNode(val, head);
        ListNode cur = dummy;
        while(cur.next != null){
            if(cur.next.val == val){
                cur.next = cur.next.next;
            }else{
                cur = cur.next;
            }
        }
        return dummy.next;
    }
}

theme: smartblue

707.设计链表

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

题解:代码随想录 (programmercarl.com)

状态:半AC

思路

注意:注意size要加减处理,此外还要注意每种操作的index超出索引的非法情况判断

代码

java 复制代码
class MyLinkedList {
    class ListNode {
        int val;
        ListNode next;
        ListNode() {}
        ListNode(int val) { this.val = val; }
        ListNode(int val, ListNode next) { 
            this.val = val; 
            this.next = next; 
        }
    }

    private int size;
    private ListNode head; // 哨兵节点

    public MyLinkedList() {
        this.size = 0;
        this.head = new ListNode(0); // 哨兵节点
    }

    public int get(int index) {
        if (index < 0 || index >= size) return -1;
        ListNode curr = head.next; // 跳过哨兵
        for (int i = 0; i < index; i++) {
            curr = curr.next;
        }
        return curr.val;
    }

    public void addAtHead(int val) {
        ListNode newNode = new ListNode(val, head.next);
        head.next = newNode;
        size++;
    }

    public void addAtTail(int val) {
        ListNode curr = head;
        while (curr.next != null) { // 遍历到最后一个节点
            curr = curr.next;
        }
        curr.next = new ListNode(val);
        size++;
    }

    public void addAtIndex(int index, int val) {
        if (index < 0 || index > size) return;
        if (index == 0) {
            addAtHead(val);
            return;
        }
        if (index == size) {
            addAtTail(val);
            return;
        }
        ListNode prev = head;
        for (int i = 0; i < index; i++) {
            prev = prev.next;
        }
        prev.next = new ListNode(val, prev.next);
        size++;
    }

    public void deleteAtIndex(int index) {
        if (index < 0 || index >= size) return;
        ListNode prev = head;
        for (int i = 0; i < index; i++) {
            prev = prev.next;
        }
        prev.next = prev.next.next;
        size--;
    }
}

theme: smartblue

206.反转链表

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

题解:代码随想录 (programmercarl.com)

状态:第三次卡壳了,要用双指针,定义一个prev和一个curr,这个题不适合虚拟头节点

思路

注意:双指针或递归都可以,不要用虚拟头节点,prev定义成null

代码

时间复杂度:O(n) 空间复杂度:O(1)

java 复制代码
class Solution {
    public ListNode reverseList(ListNode head) {
        ListNode prev = null;
        ListNode curr = head;
        while(curr != null){
            ListNode temp = curr.next;
            curr.next = prev;
            prev = curr;
            curr = temp;
        }
        return prev;
    }
}
相关推荐
bug菌10 分钟前
CAP定理真的是死结?业务系统到底该怎么取舍!
分布式·后端·架构
林太白20 分钟前
Rust认识安装
前端·后端·rust
掘金酱21 分钟前
🔥 稀土掘金 x Trae 夏日寻宝之旅火热进行ing:做任务赢大疆pocket3、Apple watch等丰富大礼
前端·后端·trae
xiayz24 分钟前
引入mapstruct实现类的转换
后端
Java微观世界28 分钟前
深入解析:Java中的原码、反码、补码——程序员的二进制必修课
后端
不想说话的麋鹿28 分钟前
《NestJS 实战:RBAC 系统管理模块开发 (四)》:用户绑定
前端·后端·全栈
Java水解1 小时前
JavaScript 正则表达式
javascript·后端
前端付豪2 小时前
微信支付风控系统揭秘:交易评分、实时拦截与行为建模全流程实战
前端·后端·架构
深栈解码2 小时前
OpenIM 源码深度解析系列(四):在线状态相关存储结构
后端
前端付豪2 小时前
微信视频号推荐系统揭秘:兴趣建模、多模态分析与亿级流控架构实战
前端·后端·算法