代码随想录二刷第三天 | 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;
    }
}
相关推荐
开心就好20259 分钟前
iOS应用性能监控全面解析:CPU、内存、FPS、卡顿与内存泄漏检测
后端
问今域中1 小时前
Spring Boot 请求参数绑定注解
java·spring boot·后端
计算机程序设计小李同学1 小时前
婚纱摄影集成管理系统小程序
java·vue.js·spring boot·后端·微信小程序·小程序
一 乐2 小时前
绿色农产品销售|基于springboot + vue绿色农产品销售系统(源码+数据库+文档)
java·前端·数据库·vue.js·spring boot·后端·宠物
3***68842 小时前
Spring Boot中使用Server-Sent Events (SSE) 实现实时数据推送教程
java·spring boot·后端
C***u1762 小时前
Spring Boot问题总结
java·spring boot·后端
上进小菜猪2 小时前
基于 YOLOv8 的人体与行人检测智能识别实战 [目标检测完整源码]
后端
Elieal2 小时前
5 种方式快速创建 SpringBoot 项目
java·spring boot·后端
c***69302 小时前
Spring Boot实时推送技术详解:三个经典案例
spring boot·后端·状态模式
Mr -老鬼3 小时前
Rust适合干什么?为什么需要Rust?
开发语言·后端·rust