• Leetcode刷题Day3----------链表


    Leetcode刷题Day3----------链表

    1. 链表基础
    • 文章链接:https://programmercarl.com/%E9%93%BE%E8%A1%A8%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html
    2. 移除链表元素 (203)
    • 题目链接:https://leetcode.cn/problems/remove-linked-list-elements/
    • 文章讲解: https://programmercarl.com/0203.%E7%A7%BB%E9%99%A4%E9%93%BE%E8%A1%A8%E5%85%83%E7%B4%A0.html
    • 视频讲解: https://www.bilibili.com/video/BV18B4y1s7R9/?vd_source=1fb98c05c7fbfd06713f014ea5079d5b

    法一:设置虚拟头节点
    关键
    - 节点A=节点B------------>让节点A移动到节点B的位置
    - 节点A.next=节点B------------>让节点A与节点B连接

    class Solution {
        public ListNode removeElements(ListNode head, int val) {
            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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    3. 设计链表 (707)
    • 题目链接/文章讲解/视频讲解:https://programmercarl.com/0707.%E8%AE%BE%E8%AE%A1%E9%93%BE%E8%A1%A8.html
    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 dummy=head;
            for(int i=0;i<=index;i++){
                dummy=dummy.next;
            }
            return dummy.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<0||index > size) return;
            
            size++;
            
            ListNode dummy = head;
            for (int i = 0; i < index; i++) {
                dummy = dummy.next;
            }
            ListNode addNode = new ListNode(val);
            addNode.next = dummy.next;
            dummy.next = addNode;
        }
    
        
        public void deleteAtIndex(int index) {
            if(index<0||index >= size) return;
            size--;
            ListNode dummy = head;
            for (int i = 0; i < index; i++) {
                dummy = dummy.next;
            }
            
            dummy.next = dummy.next.next;
            
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    4. 反转链表 (206)
    • 题目链接/文章讲解/视频讲解:https://programmercarl.com/0206.%E7%BF%BB%E8%BD%AC%E9%93%BE%E8%A1%A8.html

    关键点

    1. 考虑反转后的第一个节点是null,所以pre=null;
    2. 循环什么时候结束?在遍历到最后一个节点的时候结束,因为下一个就是null了,null在pre的第一个规定过了;
    3. 循环内部的四个步骤:
      3.1 先保存cur.next,为了后面让cur移动能找到现在cur的下一个
      3.2 开始转变指针方向!cur指到pre即可
      3.3 移动pre到现在的cur的位置
      3.4 移动cur到原来cur下一个的位置,也就是第一步保存了的节点
    class Solution {
        public ListNode reverseList(ListNode head) {
            ListNode pre=null;
            ListNode cur=head;
            while(cur!=null){
                ListNode temp=cur.next;
                cur.next=pre;
                pre=cur;
                cur=temp;
            }
            return pre;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
  • 相关阅读:
    面试题 03.03. 堆盘子-c语言
    pdf在线工具
    【EI会议征稿】第三届网络安全、人工智能与数字经济国际学术会议(CSAIDE 2024)
    程序包简单解释
    浅析搭建视频监控汇聚平台的必要性及场景应用
    Kafka 典型问题与排查以及相关优化
    SpringCloud Alibaba微服务实战三 - 服务调用
    node.js的模块
    9.strspn函数
    内网渗透之Windows反弹shell(四)
  • 原文地址:https://blog.csdn.net/qq_43563187/article/details/127939038