算法学习day03链表part01-203、707、206

复制代码
package SecondBrush.LinkedList.LL1;

/**
 * 203.移除链表元素
 * 删除链表中等于给定值 val 的所有节点。
 * 自己再次概述一下这个过程:
 * 1.移除元素,要采用设置虚拟节点的方式,因为那样不需要考虑头结点问题
 * 2.设置两个虚拟指向
 * 3.移除元素就是遍历链表,然后碰到 目标值,就直接跨过目标值
 * */
public class RemoveLinkedListElements_203 {
    public ListNode remove(ListNode head,int val){
        if (head == null) {
            return head;
        }
        ListNode dummyhead = new ListNode(-1,head);
        ListNode pred = dummyhead;
        ListNode cur = head;
        while (cur != null){
            if (cur.val == val){
                pred.next = cur.next;
            }else {
                pred = cur;
            }
            cur = cur.next;
        }
        return dummyhead.next;
    }
}
复制代码
复制代码
package SecondBrush.LinkedList.LL1;


/**
  * 707. 设计链表
 * MyLinkedList() 初始化 MyLinkedList 对象。
 * int get(int index) 获取链表中下标为 index 的节点的值。如果下标无效,则返回 -1 。
 * void addAtHead(int val) 将一个值为 val 的节点插入到链表中第一个元素之前。在插入完成后,新节点会成为链表的第一个节点。
 * void addAtTail(int val) 将一个值为 val 的节点追加到链表中作为链表的最后一个元素。
 * void addAtIndex(int index, int val) 将一个值为 val 的节点插入到链表中下标为 index 的节点之前。如果 index 等于链表的长度,那么该节点会被追加到链表的末尾。如果 index 比长度更大,该节点将 不会插入 到链表中。
 * void deleteAtIndex(int index) 如果下标有效,则删除链表中下标为 index 的节点。
 *
 *
 * 自己再概述一下思路:
 * 这是一个考察链表的好题目:
 * 拿到下标元素,首先要考虑边界问题,然后遍历 取值
  */

/**
 * 还是有迷惑的点,就是index边界问题,想不明白
 *
 * */
public class DesignLinkedList_707 {
}

class MyLinkedList1{
    int size;
    ListNode head;

    // 初始化
    public void 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++) { // 能勉强写出来,但是边界感不清楚,为什么包含index
            // 瞬间想明白了,因为我们加了一下虚拟节点,所以虽然取值 index的,但是实际是 index+1
            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;
        }
        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--;
        if (index == 0){
            head = head.next;
        }
        ListNode pred = head;
        for (int i = 0; i < index; i++) {
         pred = pred.next;
        }
        pred.next = pred.next.next;
    }



}
复制代码
复制代码
package SecondBrush.LinkedList.LL1;
/**
 * 206.反转链表
 *
 * */
public class ReverseLinkedList_206 {
    public ListNode reverseList(ListNode head){
        ListNode prev = null;
        ListNode temp = null;
        ListNode cur = head;
        while (cur != null){
            temp = cur.next;
            cur.next = prev;
            prev = cur;
            cur = temp;
        }
        return prev;
    }
}
复制代码

 

posted @   坤坤无敌  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
点击右上角即可分享
微信分享提示