链表系列入门指南(二):吃透这几题,链表解题不再难

前言

多的不说,先说重点,链表的核心解题点,都和链表的基本操作有关:添加、删除、翻转、头结点

解题思路

核心的思路就两个:

  1. 单链表需要往前倒数数的,考虑快慢指针
  2. 反转、删除、等基础操作,都依赖虚拟头节点,即当前位置k-1的节点,需要提前保存

删除倒数第n个链表节点 middle leetcode 19

时间3分钟

Golang 复制代码
/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func removeNthFromEnd(head *ListNode, n int) *ListNode {
    h := &ListNode{Next: head}
    cnt := 0
    slowNode := h
    
    //倒数一般都是快慢指针
    //倒数第x个 那就距离第x个遍历到最后1个就行
    for node := h;node != nil;node=node.Next{
        if node.Next == nil{
            snodeNxt := slowNode.Next
            slowNode.Next = snodeNxt.Next
        }
        if cnt >= n{
            slowNode = slowNode.Next
        }
        cnt++
    }
    return h.Next
}

删除链表的重复值节点 middle leetcode 82

删除链表的第n个节点,比较简单,一个hash统计,一个链表删除 删除注意记录上一个节点就可以搞定

Golang 复制代码
func deleteDuplicates(head *ListNode) *ListNode {
    m := make(map[int]int)
    h := &ListNode{Next: head}
    for node:=head;node!=nil;node=node.Next{
        m[node.Val]++
    }

    lastNode := h
    for node:=head;node!=nil;node=node.Next{
        if m[node.Val]>=2{
            lastNode.Next = node.Next
        }else{
            lastNode = node
        }
    }
    return h.Next
}

旋转链表 middle leetcode 61

首先转换题意 等价于后k个节点插入到前面

后k个节点插入到链表首部 这个操作依赖4个节点 1. 倒数k+1个节点 断链后 前半部分的尾巴节点, 2. 断链后 后半部分首、尾节点 3. 虚拟头节点

如果K>=len链表长度,可以理解到,本质超过长度的部分可以算一个周期,直接求余,剩下来的长度仍然是后k%len 个要移动插入的节点 比如 k = 4 0,1,2 2往右边移动4次,本质相当于往右边移动1次 = 4 % 3

Golang 复制代码
func rotateRight(head *ListNode, k int) *ListNode {
    // 特殊判断只有1个或者为空的情况
    if head == nil || head.Next == nil{
        return head
    }
    h := &ListNode{Next: head}
    cnt := 0

    var oldTailNode *ListNode
    var lastKNode *ListNode
    lastKNode = h
    for node:=head;node!=nil;node=node.Next{
        cnt++
        oldTailNode = node
    }   
    k %= cnt
    // 如果不需要移动也直接返回
    if k == 0{
        return head
    }
    cnt = 0
    for node:=head;node!=nil;node=node.Next{
        cnt++
        if cnt >= k+1{
            lastKNode = lastKNode.Next
        }
    }    
    newHead := lastKNode.Next
    lastKNode.Next = oldTailNode.Next
    oldTailNode.Next = head
    h.Next = newHead
    return h.Next
}

总结

  1. 核心操作:链表基础操作(添加、删除、翻转、头结点运用)是解题根基,贯穿各类题型。
  1. 解题思路:单链表往前倒数,用快慢指针;涉及反转、删除,借助虚拟头节点,提前保存当前位置 k - 1 的节点。
  1. 例题解法
  • 删除倒数第 n 个链表节点:利用快慢指针定位待删节点前驱,实现删除。
  • 删除链表的重复值节点:哈希表统计频次,结合链表删除操作。
  • 旋转链表:转换题意,依据节点位置关系,调整链表结构 。
相关推荐
AndrewHZ10 分钟前
【Python生活】如何构建一个跌倒检测的算法?
python·算法·生活·可视化分析·陀螺仪·加速度计·跌倒检测
写个博客1 小时前
代码随想录算法训练营第三十九天
算法
源码方舟2 小时前
【基于ALS模型的教育视频推荐系统(Java实现)】
java·python·算法·音视频
蜗牛沐雨2 小时前
Rust 中的 `PartialEq` 和 `Eq`:深入解析与应用
开发语言·后端·rust
Python私教2 小时前
Rust快速入门:从零到实战指南
开发语言·后端·rust
fancy1661662 小时前
力扣top100 矩阵置零
人工智能·算法·矩阵
秋野酱3 小时前
基于javaweb的SpringBoot爱游旅行平台设计和实现(源码+文档+部署讲解)
java·spring boot·后端
元亓亓亓3 小时前
LeetCode热题100--240.搜索二维矩阵--中等
算法·leetcode·矩阵
小明.杨3 小时前
Django 中时区的理解
后端·python·django
有梦想的攻城狮3 小时前
spring中的@Async注解详解
java·后端·spring·异步·async注解