算法刷题记录5 - 链表1 - 2023.10.17

经过一轮学习,代码随想录数组部分是搞定了,接下来是链表部分。

第一题

203. 移除链表元素
代码随想录

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode removeElements(ListNode head, int val) {
        // 这题不难,主要考察对链表的操作
        if(head == null) return head;
        // 虚拟头结点,用统一的逻辑处理链表头和链表其他元素
        ListNode dummy = new ListNode(-1,head);
        ListNode pre = dummy;
        ListNode cur = head;
        while (cur != null) {
            if (cur.val == val) pre.next = cur.next;
            else pre = cur;
            cur = cur.next;
        }
        return dummy.next;
    }
}

第二题

707. 设计链表
代码随想录
这道题没完全做出来,虽然应该算中等难度里比较简单的。首先要考虑到要新建ListNode 类,而在MyLinkedList 类里的成员变量设为size和head。第二个点要考虑到addAtIndex其实可以复用到头尾的添加函数里,一下就优雅很多。

//单链表
class ListNode {
    int val;
    ListNode next;
    ListNode(){}
    ListNode(int val) {
        this.val=val;
    }
}

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.next; // 排除虚拟头结点
        // for循环的主要作用就是用来做查询到某个索引位置的链表节点
        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;
        if (index < 0) index = 0;
        ListNode addNode = new ListNode(val);
        // 找待更新点的前驱
        ListNode pre = head;
        for (int i = 0; i < index; i++) 
            pre = pre.next;
        // 先更新后继,再更新前继,否则前继断了,就找不到更新的点了
        addNode.next = pre.next;
        pre.next = addNode;
        size++;
    }
    
    public void deleteAtIndex(int index) {
        if(index < 0 || index > size) return;
        ListNode pre = head;
        for (int i = 0; i < index; i++) 
            pre = pre.next;
        pre.next = pre.next.next;
        size--;
    }
}

/**
 * Your MyLinkedList object will be instantiated and called as such:
 * MyLinkedList obj = new MyLinkedList();
 * int param_1 = obj.get(index);
 * obj.addAtHead(val);
 * obj.addAtTail(val);
 * obj.addAtIndex(index,val);
 * obj.deleteAtIndex(index);
 */

未完待续……

你可能感兴趣的:(算法,算法,链表,数据结构,leetcode,java)