【3】3道链表力扣题:删除链表中的节点、反转链表、判断一个链表是否有环

3道链表力扣题

  • 一、删除链表中的节点
    • [🌏 题目链接](#🌏 题目链接)
    • [📕 示例](#📕 示例)
    • [🍀 分析](#🍀 分析)
    • [💻 代码](#💻 代码)
  • 二、反转链表
    • [🌏 题目链接](#🌏 题目链接)
    • [📕 示例](#📕 示例)
    • [🍀 分析](#🍀 分析)
      • [① 递归](#① 递归)
      • [② 迭代](#② 迭代)
  • 三、判断一个链表是否有环
    • [🌏 题目链接](#🌏 题目链接)
    • [📕 示例](#📕 示例)
    • [🍀 分析](#🍀 分析)
    • [💻 代码](#💻 代码)

一、删除链表中的节点

🌏 题目链接

【删除链表中的节点】https://leetcode.cn/problems/delete-node-in-a-linked-list/description/

📕 示例

🖊 输入: head = [4, 5, 1, 9], node = 5

🖊 输出: [4, 1, 9]

🖊 解释: 指定链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9

🖊 输入: head = [4, 5, 1, 9], node = 1

🖊 输出: [4, 5, 9]

🖊 解释: 指定链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9

🍀 分析

java 复制代码
public class ListNode {
    int val;
    ListNode next;

    ListNode(int x) {
        val = x;
    }
}

🖊 每一个节点就是一个 ListNode 对象

🖊 val 属性存储了具体的数据

🖊 next 属性存储了一个节点的内存地址

java 复制代码
public class Solution {
    public void deleteNode(ListNode node) {

    }
}

🖊 deleteNode(ListNode node) 方法中,参数node 是要被"删除"的节点

🖊 在该题中能够获得到的已知条件就只有这个要被删除的节点 node
🖊 已知: 要被删除的节点 node

🖊 根据已知可以得到: ① 要被删除的节点往后的所有节点 node.next.next...(这里就考虑它的下一个节点 node.next);② 可以得到节点的 valnode


🖊 这里的删除第三个节点,并不是把该节点从内存中移除,而是让第三个节点的值不再是【1】,而是它的下一个节点的值【9】。并且第三个节点的 next 存储它的下一个节点的 next

💻 代码

java 复制代码
class Solution {
    public void deleteNode(ListNode node) {
        // 用被删除节点的下一个节点的值覆盖被删除节点的值
        node.val = node.next.val;
        // 被删除节点的next指向它下一个节点的next
        node.next = node.next.next;
    }
}

二、反转链表

🌏 题目链接

【206.反转链表】https://leetcode.cn/problems/reverse-linked-list/description/

📕 示例

🖊 输入: head = [1, 2, 3, 4, 5]

🖊 输出: [5, 4, 3, 2, 1]

🖊 输入: head = [1, 2]

🖊 输出: [2,1]
🖊 输入: head = []

🖊 输出: []

🍀 分析

java 复制代码
class Solution {
    public ListNode reverseList(ListNode head) {

    }
}

🖊 reverseList(ListNode head) 方法只有一个参数 head(头指针),它指向了头节点

① 递归

👆 如上图所示,假如 reverseList 方法编写成功的话,reverseList(head) 方法调用后,该链表的头指针会指向方法调用之前的尾节点(如上图的 newHead

👆 原本的 head = [5, 4, 3, 2, 1] 也变成了 head = [1, 2, 3, 4, 5]

🖊 假如 reverseList(head.next) 调用成功,则整个链表如上图所示




java 复制代码
public class Solution {
    public ListNode reverseList(ListNode head) {
        if (head == null || head.next == null) return head;

        // 递归
        ListNode newHead = reverseList(head.next);

        head.next.next = head;
        head.next = null;

        return newHead;
    }
}

② 迭代

🖊 已知条件就只有一个头指针 head,只能通过这个 head 进行反转


java 复制代码
public class Solution {
    /**
     * 头插法(迭代)
     */
    public ListNode reverseList(ListNode head) {
        if (head == null || head.next == null) return head;

        ListNode newHead = null;
        do {
            ListNode tmp = head.next;
            head.next = newHead;
            newHead = head;
            head = tmp;
        } while (head != null);

        return newHead;
    }
}

三、判断一个链表是否有环

🌏 题目链接

141.判断一个链表是否有环:https://leetcode.cn/problems/linked-list-cycle/description/

📕 示例

🍀 分析

🖊 使用快慢指针思想完成

🖊 fast 指针每次 next 两步;slow 指针每次 next 一步。若有环的话,快慢指针必然相遇

🖊 如果 fast 指向 null 或 fast.next 指向 null,则链表没有环

💻 代码

java 复制代码
public class Solution {
    public boolean hasCycle(ListNode head) {
        if (head == null || head.next == null) return false;

        ListNode slow = head;
        ListNode fast = head.next;

        // 【fast == null || fast.next == null】都代表链表无环
        while (fast != null && fast.next != null) {
            slow = slow.next;
            fast = fast.next.next;

            if (slow == fast) return true;
        }

        return false;
    }
}

🍀 完整代码

相关推荐
To_OC17 小时前
LC 994 腐烂的橘子:人人都说是 BFS 入门题,我却写了三遍才过
javascript·算法·leetcode
To_OC1 天前
LC 200 岛屿数量:经典 DFS 入门题,我第一次写居然连方向都搞错了
javascript·算法·leetcode
To_OC2 天前
LC 128 最长连续序列:别上来就排序,O (n) 解法才是这题的灵魂
javascript·算法·leetcode
刘马想放假2 天前
Modbus 全栈技术解析:TCP、RTU、ASCII、RTU over TCP
数据结构·网络协议
北域码匠3 天前
冒泡排序太慢?鸡尾酒排序双向优化,原生 C# 零第三方库完整代码
数据结构·排序算法·泛型·c# 算法·鸡尾酒排序·原生 c# 开发·冒泡排序优化·嵌入式算法
To_OC4 天前
LC 49 字母异位词分组:想到哈希表很简单,选对 key 才是精髓
javascript·算法·leetcode
To_OC5 天前
LC 1 两数之和:面试第一道必考题,暴力解法直接被面试官 pass
javascript·算法·leetcode
Darling噜啦啦10 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
小小工匠11 天前
Redis - 事务机制:能实现 ACID 属性吗
数据结构·redis·性能优化·并发·持久化
玖玥拾11 天前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器