代码随想录二刷第三天 | 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;
    }
}
相关推荐
青柠编程2 小时前
基于Spring Boot的竞赛管理系统架构设计
java·spring boot·后端
s9123601013 小时前
【rust】 pub(crate) 的用法
开发语言·后端·rust
夕颜1115 小时前
关于排查问题的总结
后端
码事漫谈5 小时前
揭秘RAG的核心引擎:Document、Embedding与Retriever详解
后端
码事漫谈5 小时前
BM25 检索是什么
后端
Moment6 小时前
写代码也能享受?这款显示器让调试变得轻松又高效!😎😎😎
前端·后端
无双_Joney7 小时前
[更新迭代 - 1] Nestjs 在24年底更新了啥?(bug修复篇)
前端·后端·node.js
stark张宇8 小时前
从入门到放弃?一份让PHP学习持续正反馈的知识清单
后端·php
sunbin8 小时前
软件授权管理系统-整体业务流程图(优化版)
后端
一只专注做软件的湖南人8 小时前
京东商品评论接口(jingdong.ware.comment.get)技术解析:数据拉取与情感分析优化
前端·后端·api