代码随想录算法训练营第三天| 链表part1

203.移除链表元素 :

题目链接/文章讲解/视频讲解::代码随想录

class Solution {
    public ListNode removeElements(ListNode head, int val) {
        ListNode dummy = new ListNode(-1);
        dummy.next = 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;
    }
}

为什么不直接返回 head 的原因:

  1. 头结点可能被删除:如果 head 指向的节点需要被删除(即 head.val == val),那么删除后的新链表将有一个不同的头结点。由于 head 是一个局部变量,直接修改它并不会影响调用方的链表引用。

  2. 使用虚拟头结点简化逻辑:通过引入一个虚拟头结点(dummy node),可以使得所有的节点(包括原始的头结点)都被统一处理。这样,你就无需编写特殊逻辑来单独处理头结点的删除情况。

  3. 返回统一的节点:由于虚拟头结点始终指向新链表的头部(即使原始的头结点被删除),因此返回 dummy.next 可以确保总是返回正确的新链表头结点。

707.设计链表 :

题目链接/文章讲解/视频讲解:代码随想录

class MyLinkedList {
    int size;
    ListNode head;

    class ListNode {
    int val;
    ListNode next;

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

    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;
    }
}

206.反转链表 :

题目链接/文章讲解/视频讲解:代码随想录

class Solution {
    public ListNode reverseList(ListNode head) {
        ListNode pre = null;
        ListNode cur = head;
        while(cur != null) {
            ListNode tmp = cur.next;
            cur.next = pre;
            pre = cur;
            cur = tmp;
        }
        return pre;
    }
}

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