热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

删除链表的倒数第k个结点

删除链表的倒数第k个结点问题重述:给你一个链表,删除链表的倒数第k个结点,并且返回链表的头结点。示例1:输入:head[1,2,3,4,5],k2输出:[1,2,3,5]示例2:输

删除链表的倒数第k个结点

问题重述:

给你一个链表,删除链表的倒数第 k 个结点,并且返回链表的头结点。

示例 1:

img

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

示例 2:

输入:head = [1], k = 1
输出:[]

示例 3:

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

提示:



  • 链表中结点的数目为 sz

  • 1 <= sz <= 30

  • 0 <= Node.val <= 100

  • 1 <= k <= sz


问题分析:

本题要求删除倒数第k个结点,重要的是获取删除结点的前一个结点,将该节点的下一个结点指向要删除的节点的下一个结点,常规思路是遍历链表,获得链表长度,然后根据链表长度找到要删除的结点,这种方法需要遍历两次链表。使用双指针的方法可以做到一次遍历就能够找到结点。使用双指针,一个指针从头开始一个指针从第k个开始,然后两个指针一起向后遍历,当快指针到达链表尾部的时候,慢指针对应的刚好是倒数第k+1个结点


解法:

链表遍历、双指针(一次遍历)


解题:


代码:

package test.linklist;
/**
*
* @author FOLDN
* 从长度为n的链表中,删除倒数第k个结点
*
*/
public class DeleteKthNode {
public static void main(String[] args) {

}
public static Node deleteKthNode(Node head,int k) {
/*
if(k <1 || head == null) {
return head;
}
// 方法一,直接遍历链表
// 记录链表的头,因为最后要返回链表的头
Node linkedList = head;
while(linkedList != null) {
// 第一次遍历链表,每经过一个结点,k-1,遍历到最后k = k-n
k = k-1;
linkedList = linkedList.next;
}
// 遍历完链表后,k有三种情况,分别是等于0,大于0,小于0
// k大于0,说明需要删除的结点不存在于链表中,不需要处理,直接返回链表即可
// k等于0,说明要删除的是链表的头节点
if(k == 0) {
// 删除头节点然后返回链表
head = head.next;
}
// k小于0,需要再次进行遍历确定要删除的结点
if(k <0) {
// 第二次遍历需要注意的是此时的linkedList对应的是最后的结点,所以需要重新赋值
linkedList = head;
while(k != 0) {
k = k+1;
linkedList = linkedList.next;
}
// 删除结点
linkedList.next = linkedList.next.next;
}
return head;
*/
// 方法二,使用双指针,只需要使用一次循环
if(k <1 || head == null) {
return head;
}
Node fast = head;
Node slow = head;
for(int i = 0;i fast = fast.next;
}
// 这一步是为了当删除的结点是头结点的时候,可以正常返回
if(fast == null) {
return head.next;
}
while(fast.next != null) {
fast = fast.next;
slow = slow.next;
}
slow.next = slow.next.next;
return head;
}
}

代码解析:

链表遍历相当简单,就是先遍历一般确定长度,然后通过长度确定要删除的节点的前一个结点,然后第二次遍历找到要要删除的结点的前一个结点,对链表进行更改

本题我们使用快慢双指针对链表进行遍历,一遍遍历即可确定要删除的结点。首先让快指针fast先向前移动k个位置,此时让fast指针和slow指针一起向后遍历,当fast指针遍历完最后一个节点(即此时的fast结点对应的是链表最后一个结点对应的next,为null)的时候,slow结点对应的结点就是要删除的结点。为了简便删除对应结点,我们可以一开始创建一个哑结点,将该节点的next设为head,这样我们可以处理直接处理当要删除的结点为头节点的问题,并且找到的结点是要删除的节点的下一个结点


总结:

快慢双指针一般用于倒数的元素的处理或者检测会回文序列



推荐阅读
  • 本文介绍了如何在 Oracle 数据库中结合使用 UPDATE 和 SELECT 语句,以实现复杂的数据更新操作。首先准备测试环境和数据表,然后通过嵌套查询的方式从其他表中获取需要更新的值,最后执行更新操作并验证结果。 ... [详细]
  • 本文将详细解析胖AP和瘦AP在组网中的区别,帮助您更好地理解两者的应用场景及配置方式。 ... [详细]
  • 本文介绍了如何使用Java中的同步方法和同步代码块来实现两个线程的交替打印。一个线程负责打印1到52的数字,另一个线程负责打印A到Z的字母,确保输出顺序为12A34B...5152Z。 ... [详细]
  • 本文将介绍网易NEC CSS框架的规范及其在实际项目中的应用。通过详细解析其分类和命名规则,探讨如何编写高效、可维护的CSS代码,并分享一些实用的学习心得。 ... [详细]
  • 本文探讨了三种常用的数值求解方法——有限差分法(FDM)、有限元法(FEM)和有限容积法(FVM),并详细介绍了它们的基本原理及应用场景。 ... [详细]
  • 通过Web界面管理Linux日志的解决方案
    本指南介绍了一种利用rsyslog、MariaDB和LogAnalyzer搭建集中式日志管理平台的方法,使用户可以通过Web界面查看和分析Linux系统的日志记录。此方案不仅适用于服务器环境,还提供了详细的步骤来确保系统的稳定性和安全性。 ... [详细]
  • 本文详细介绍了Wi-Fi Portal认证协议的原理、流程和相关技术细节,涵盖用户上线认证、下线流程以及数据报文格式等内容。 ... [详细]
  • 近期入住杭州索菲亚大酒店的经历令人失望。酒店在服务、设施和周边环境方面存在诸多问题,给游客带来了不便。本文将详细描述这些问题,为未来的住客提供参考。 ... [详细]
  • C# LiNQ 查询 join连接
    C# LiNQ 查询 join连接 ... [详细]
  • 2021年湖南单招院校排名及推荐:有哪些大专院校值得关注?
    湖南省近年来高考报名人数逐年递增,目前全省共有125所高校,其中73所为专科院校。随着新高考政策的实施,各单招院校预计将增加招生名额。本文将介绍2021年湖南单招学校的排名情况,并提供详细的院校名单和专业推荐。 ... [详细]
  • PHP插件机制的实现方案解析
    本文深入探讨了PHP中插件机制的设计与实现,旨在分享一种可行的实现方式,并邀请读者共同讨论和优化。该方案不仅涵盖了插件机制的基本概念,还详细描述了如何在实际项目中应用。 ... [详细]
  • 本文详细介绍了模拟电子技术中放大电路的动态分析方法,重点探讨了微变等效电路的应用及其在实际电路设计中的重要性。 ... [详细]
  • 区块链赋能新零售:提升线下溯源防伪体验,保障线上消费安全
    通过区块链技术的应用,实现产品全流程溯源和防伪,为消费者提供更安全、放心的线上线下购物体验。 ... [详细]
  • 本文详细介绍了Java中的三大类设计模式:创建型模式、结构型模式和行为型模式,并探讨了设计模式遵循的六大原则,帮助开发者更好地理解和应用这些模式。 ... [详细]
  • 本文详细探讨了 Django 的 ORM(对象关系映射)机制,重点介绍了其如何通过 Python 元类技术实现数据库表与 Python 类的映射。此外,文章还分析了 Django 中各种字段类型的继承结构及其与数据库数据类型的对应关系。 ... [详细]
author-avatar
LoisWangol_326
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有