代码随想录刷题记录第三天 | 链表 | 203. 移除链表元素

题目:
203. 移除链表元素 - https://leetcode.cn/problems/remove-linked-list-elements/description/
707. 设计链表 - https://leetcode.cn/problems/design-linked-list/
206. 反转链表 - https://leetcode.cn/problems/reverse-linked-list/description/

203. 移除链表元素

题目内容:给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。

解题思路

设置虚拟头节点,如果不设置头节点,就要单独使用while循环对头节点进行处理(因为可能从head开始就一直是符合val的值的节点),然后直到 head.val != val ,再设置要返回的新的头节点使其等于head,然后再设置一个新的节点去遍历链表删除节点值等于val的节点,设置虚拟节点可以统一处理。

解题代码

class Solution {
    public ListNode removeElements(ListNode head, int val) {
        ListNode first = new ListNode();
        first.next = head;
        ListNode temp = first;
        while(temp.next != null){
            if(temp.next.val == val){
                temp.next = temp.next.next;
            }else {
                temp = temp.next;
            }
        }
        return first.next;
    }
}

707. 设计链表

题目内容你可以选择使用单链表或者双链表,设计并实现自己的链表。
单链表中的节点应该具备两个属性:val 和 next 。val 是当前节点的值,next 是指向下一个节点的指针/引用。
如果是双向链表,则还需要属性 prev 以指示链表中的上一个节点。假设链表中的所有节点下标从 0 开始。

解题代码

class MyLinkedList {
    int size;
    ListNode head;

    public MyLinkedList() {
        size = 0;
        head = new ListNode(0);
    }

    public int get(int index) {
        if (index < 0 || index >= size) {
            return -1;
        }
        ListNode cur = head;
        for (int i = 0; i <= index; i++) {
            cur = cur.next;
        }
        return cur.val;
    }

    public void addAtHead(int val) {
        addAtIndex(0, val);
    }

    public void addAtTail(int val) {
        addAtIndex(size, val);
    }

    public void addAtIndex(int index, int val) {
        if (index > size) {
            return;
        }
        index = Math.max(0, index);
        size++;
        ListNode pred = head;
        for (int i = 0; i < index; i++) {
            pred = pred.next;
        }
        ListNode toAdd = new ListNode(val);
        toAdd.next = pred.next;
        pred.next = toAdd;
    }

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

class ListNode {
    int val;
    ListNode next;

    public ListNode(int val) {
        this.val = val;
    }
}

206. 反转链表

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

解题代码

class Solution {
    public ListNode reverseList(ListNode head) {
        ListNode pre=null;
        ListNode cur = head;
        ListNode temp ;
        while(cur != null){
            temp = cur.next;
            cur.next = pre;
            pre = cur;
            cur = temp;
        }
        return pre;
    }
}
posted @ 2024-03-23 22:27  虚拟式  阅读(13)  评论(0)    收藏  举报