代码随想录二刷第三天 | 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;
    }
}
相关推荐
tan180°28 分钟前
MySQL表的操作(3)
linux·数据库·c++·vscode·后端·mysql
优创学社22 小时前
基于springboot的社区生鲜团购系统
java·spring boot·后端
why技术2 小时前
Stack Overflow,轰然倒下!
前端·人工智能·后端
幽络源小助理2 小时前
SpringBoot基于Mysql的商业辅助决策系统设计与实现
java·vue.js·spring boot·后端·mysql·spring
ai小鬼头3 小时前
AIStarter如何助力用户与创作者?Stable Diffusion一键管理教程!
后端·架构·github
简佐义的博客3 小时前
破解非模式物种GO/KEGG注释难题
开发语言·数据库·后端·oracle·golang
Code blocks3 小时前
使用Jenkins完成springboot项目快速更新
java·运维·spring boot·后端·jenkins
追逐时光者4 小时前
一款开源免费、通用的 WPF 主题控件包
后端·.net