LeetCode刷题笔记之链表

一、移除链表元素

1. 203【移除链表元素】

  • 题目: 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
  • 代码:
/**
 * 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) {
   
        ListNode dummyHead = new ListNode();
        dummyHead.next = head;
        ListNode tempNode = dummyHead;
        while (tempNode.next != null){
   
            if(tempNode.next.val == val){
   
                tempNode.next = tempNode.next.next;
            }else {
   
                tempNode = tempNode.next;
            }
        }
        return dummyHead.next;
    }
}

二、设计链表

1. 707【设计链表】

  • 题目: 你可以选择使用单链表或者双链表,设计并实现自己的链表。
    单链表中的节点应该具备两个属性:val 和 next 。val 是当前节点的值,next 是指向下一个节点的指针/引用。如果是双向链表,则还需要属性 prev 以指示链表中的上一个节点。假设链表中的所有节点下标从 0 开始。
    实现 MyLinkedList 类:
    • 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 的节点。
  • 代码:
class MyLinkedList {
   
    ListNode head;
    int size;

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

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

    public void addAtHead(int val) {
   
        ListNode newNode = new ListNode(val);
        newNode.next = head.next;
        head.next = newNode;
        size++;
    }

    public void addAtTail(int val) {
   
        ListNode newNode = new ListNode(val);
        ListNode tempNode = head;
        for (int i = 0; i < size; i++) {
   
            tempNode = tempNode.next;
        }
        tempNode.next = newNode;
        size++;
    }

    public void addAtIndex(int index, int val) {
   
        if(index > size){
   
            return;
        }
        if(index == size){
   
            addAtTail(val);
        }
        else {
   
            ListNode newNode = new ListNode(val);
            ListNode tempNode = head;
            for (int i = 0; i < index; i++) {
   
                tempNode = tempNode.next;
            }
            newNode.next = tempNode.next;
            tempNode.next = newNode;
            size++;
        }
    }

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

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

三、操作链表

1. 206【反转链表】

  • 题目: 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
  • 代码:
class Solution {
   
    public ListNode reverseList(ListNode head) {
   
        ListNode tempNode = new ListNode();
        ListNode ansNode = null;
        tempNode = head;
        while (tempNode != null){
   
            ListNode node = tempNode.next;
            tempNode.next = ansNode;
            ansNode = tempNode;
            tempNode = node;
        }
        return ansNode;
    }
}

2. 24【两两交换链表中的节点】

  • 题目: 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
  • 代码:
class Solution {
   
    public ListNode swapPairs(ListNode head) {
   
        ListNode dummyHead = new ListNode();
        dummyHead.next = head;
        ListNode tempNode = dummyHead;
        while (tempNode.next != null && tempNode.next.next != null){
   
            ListNode node = tempNode.next;
            tempNode.next = node.next;
            node.next = tempNode.next.next;
            tempNode.next.next = node;
            tempNode = tempNode.next.next;
        }
        return dummyHead.next;
    }
}

3. 19【删除链表的倒数第N个节点】

  • 题目: 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
  • 代码:
class Solution {
   
    public ListNode removeNthFromEnd(ListNode head, int n) {
   
        ListNode dummyNode = new ListNode();
        dummyNode.next = head;
        ListNode left = dummyNode;
        ListNode right = dummyNode;
        while (n >= 0){
   
            right = right.next;
            n--;
        }

        while (right != null){
   
            left = left.next;
            right = right.next;
        }
        left.next = left.next.next;
        return dummyNode.next;
    }
}

4. 02.07【链表相交】

  • 题目: 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。
  • 代码:
public class Solution {
   
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
   
        ListNode tempA = headA;
        ListNode tempB = headB;
        int n = 0, m = 0;
        while (tempA != null){
   
            n++;
            tempA = tempA.next;
        }
        while (tempB != null){
   
            m++;
            tempB = tempB.next;
        }
        tempA = headA;
        tempB = headB;
        while (n > m){
   
            tempA = tempA.next;
            n--;
        }
        while (m > n){
   
            tempB = tempB.next;
            m--;
        }
        while (tempA != null){
   
            if(tempA == tempB){
   
                return tempA;
            }
            tempA = tempA.next;
            tempB = tempB.next;
        }
        return null;
    }
}

5. 142 【环形链表Ⅱ】

  • 题目: 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
    如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。不允许修改链表。
  • 代码:
public class Solution {
   
    public ListNode detectCycle(ListNode head) {
   
        ListNode fast = head;
        ListNode slow = head;
        while (fast != null && fast.next != null){
   
            slow = slow.next;
            fast = fast.next.next;
            if(slow == fast){
   
                ListNode tempNode1 = head;
                ListNode tempNode2 = fast;
                while (tempNode1 != tempNode2){
   
                    tempNode1 = tempNode1.next;
                    tempNode2 = tempNode2.next;
                }
                return tempNode1;
            }
        }
        return null;
    }
}

相关推荐

  1. LeetCode笔记

    2023-12-09 11:52:03       25 阅读
  2. leetcode算法——

    2023-12-09 11:52:03       27 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-09 11:52:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-09 11:52:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-09 11:52:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-09 11:52:03       20 阅读

热门阅读

  1. 人大金仓(kingbase)数据库常用sql命令

    2023-12-09 11:52:03       33 阅读
  2. Elasticsearch、Logstash、Kibana(ELK)环境搭建

    2023-12-09 11:52:03       37 阅读
  3. oracle与sqlsever的区别

    2023-12-09 11:52:03       29 阅读
  4. 设计模式的定义

    2023-12-09 11:52:03       36 阅读
  5. springboot下rest接口抛异常的定制处理

    2023-12-09 11:52:03       40 阅读
  6. redis.conf详解之replica-read-only

    2023-12-09 11:52:03       31 阅读
  7. clickhouse删除partition分区数据

    2023-12-09 11:52:03       37 阅读
  8. Thinkphp5+FastAdmin配置workerman消息推送(多线程)

    2023-12-09 11:52:03       35 阅读
  9. 【Linux 软连接命令】

    2023-12-09 11:52:03       30 阅读