代码随想录二刷第三天 | 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;
    }
}
相关推荐
凤山老林9 分钟前
从 RestTemplate 到 HttpClient 5:Spring Boot HTTP 客户端性能调优与连接池治理
spring boot·后端·http
Csvn11 分钟前
📊 SQL 入门 Day 20:锁机制
后端·sql
Code额1 小时前
Python 连接 DeepSeek API,OpenAI 对话方式总结
后端·python·ai·ai编程
星火10241 小时前
【LangChain4j系列10】Guardrails 安全护栏
人工智能·后端
四千岁1 小时前
稀疏向量BM25Retriever不支持中文怎么办?jieba来帮忙
前端·javascript·后端
用户6919026813391 小时前
Docker基本概念
后端·docker·容器
颜进强1 小时前
14 - OpenSpec 老页面改造骨架:定位 + 增量 + 回归三件套
前端·后端·ai编程
唐青枫1 小时前
别只把 switch 当成多路 if:Zig 模式匹配、状态机与 Tagged Union 实战
后端
步行cgn1 小时前
MyBatis 错误 Result Maps collection does not contain value for ... 详解与解决方案
后端
用户250694921612 小时前
Cordis 从入门到实战:插件卸载后,别留下一地鸡毛
后端