链表问题----删除链表的中间节点和a/b处的节点
删除链表的中间节点和a/b处的节点
对于给定一个链表的头节点head,实现删除链表的中间节点的函数。
例如
不删除任何节点;
1->2,删除节点1
1->2->3,删除节点2
1->2->3->4,删除节点2
1->2->3->4->5,删除节点3
如果将本问题复杂一下,给定链表的头节点head、整数a和整数b,实现删除位于a/b处节点的函数。
例如
链表:1->2->3->4->5,假设 a/b 的值为r
如果 r 等于0,不删除任何节点
如果 r 在区间(0,1/5]上,删除节点 1
如果 r 在区间(1/5,2/5]上,删除节点 2
如果 r 在区间(2/5,3/5]上,删除节点 3
如果 r 在区间(3/5,4/5]上,删除节点 4
如果 r 在区间(4/5,1]上,删除节点 5
如果 r 大于1,不删除任何节点
package com.test; import com.tset.ListNode; /**
* Created by Demrystv.
*/
public class RemoveListNode { // 针对普通问题,采用的方法是找规律,当元素个数大于3时,链表长度每增加2,要删除的节点就要后移一个节点
public ListNode removeMiddle(ListNode head){ // 针对的是没有元素或者只有一个元素
if (head == null || head.next == null){
return null;
} // 针对的是只有两个元素
if (head.next.next == null){
return head.next;
} // 针对的是三个及三个以上元素,这时符合规律
ListNode pre = head;
ListNode cur = head.next.next;
while (pre.next != null && cur.next.next != null){
pre = pre.next;
cur = cur.next.next;
}
pre.next = pre.next.next;
return head;
} // 针对进阶问题,主要是找到n,即要删除的元素的位置
public ListNode removeByRatio(ListNode head, int a ,int b){
if (a < 1 || a > b){
return head;
} // 求链表的长度
int n = 0;
ListNode cur = head;
while (cur != null){
n++;
cur = cur.next;
} // n表示要删除的节点是第几个节点,可以举例证明,也可以通过举例来推导
n = (int) Math.ceil((double)(a * n) / (double) b); // 其原理类似于删除倒数第K 个节点
if (n == 1){
return head.next;
}
if (n > 1){
cur = head;
while (--n != 0){
cur = cur.next;
}
cur.next = cur.next.next;
}
return head;
} }
链表问题----删除链表的中间节点和a/b处的节点的更多相关文章
- 删除链表的中间节点和a/b处的节点
问题描述: 删除链表的中间节点和a/b处的节点 给定链表的头结点head,实现删除链表的中间节点的函数: 例如: 不删除任何节点: 1-->2,删除节点1: 1-->2-->3,删除 ...
- 删除链表中间节点和a/b处的节点
[题目]: 给定链表的头节点 head,实现删除链表的中间节点的函数. 例如: 步删除任何节点: 1->2,删除节点1: 1->2->3,删除节点2: 1->2->3-& ...
- 算法总结之 删除链表的中间节点和a/b处的节点(链表中间节点的重要思想)
给定链表的表头节点head,实现删除链表的中间节点的函数 推展: 给定链表的头节点,整数a 和 整数 b,实现删除a/b处节点的函数 先来分析原问题, 长度1 直接返回 长度2 将头节点删除 长度3 ...
- 第18题:在O(1)时间删除链表结点+删除链表中重复的节点
题目描述:题目描述在O(1)时间删除链表结点 给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点. 考查创新编程能力. 思路: 1.如果从头到尾遍历,时间O(n) 2.如果将待删 ...
- 左神算法书籍《程序员代码面试指南》——2_03删除链表的中间节点和a/b处的节点
[题目]给定链表的头节点head,实现删除链表的中间节点的函数.例如:不删除任何节点:1->2,删除节点1:1->2->3,删除节点2:1->2->3->4,删除节 ...
- [剑指offer]6.从尾到头打印链表+18.删除链表节点
链表 6.从尾到头打印链表 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回). 方法一 迭代 创建空列表res,将链表值head.val依次存进res,返回翻转后的res 代码 cl ...
- 19. [链表][双指针]删除链表的倒数第N个节点
19. 删除链表的倒数第N个节点 方法一:哨兵节点+快慢指针 在本题中,快慢指针的用法为:让快指针先走几步,步数由 \(n\) 决定. 使用哨兵节点的理由是为了避免删除节点为头结点引发的空指针异常. ...
- 链表:删除链表中重复的结点(java实现)
题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后 ...
- leetcode-19:给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * Lis ...
随机推荐
- js将已有数组重新分组(将数组每10项分成一组)
项目中碰到的一个小需求:分页请求数据,一次请求60条,需要将后台返回的数组每10条分成一组渲染一个表格(表格使用的是ant-design-vue的table) 实现逻辑: var chunk = 10 ...
- JS将扁平化的数据处理成Tree结构
let jsonData= [ { id:1, parentId:0, name:"一级菜单A" }, { id:2, parentId:0, name:"一级菜单B& ...
- OpenCV4系列之图像梯度和边缘检测
在图像处理中,求解图像梯度是常用操作. Sobel算子 Calculates the first, second, third, or mixed image derivatives using an ...
- 9种分布式ID生成之 美团(Leaf)实战
整理了一些Java方面的架构.面试资料(微服务.集群.分布式.中间件等),有需要的小伙伴可以关注公众号[程序员内点事],无套路自行领取 更多优选 一口气说出 9种 分布式ID生成方式,面试官有点懵了 ...
- dotnetcore3.1 WPF 中使用依赖注入
dotnetcore3.1 WPF 中使用依赖注入 Intro 在 ASP.NET Core 中默认就已经集成了依赖注入,最近把 DbTool 迁移到了 WPF dotnetcore 3.1, 在 W ...
- AndroidStudio更新时报错:Connection Error,Temp directory inside installation
场景 在将Android Studio的 .AndroidStudio目录修改为别的目录后,打开AS,提示更新,点击更新后提示: Connection Error,Temp directory ins ...
- Git安装配置及第一次上传项目到GitHub
平时的学习工作少不了保存自己的Code到代码库,这里必须要使用到Git与GitHub. 1. 关于Git的安装 下载Git:下载地址:https://git-scm.com/downloads ...
- mysql添加索引(建表之后)
一.使用ALTER TABLE语句创建索引 语法如下: alter table table_name add index index_name (column_list) ; alter table ...
- Openshift中Pod的SpringBoot2健康检查
Openshift中Pod的SpringBoot2应用程序健康检查 1. 准备测试的SpringBoot工程, 需要Java 8 JDK or greater and Maven 3.3.x or g ...
- mysql常见问题解决方案
属性顺序错误 一般情况下字段类型要放在前面,限制参数放在后面,UNSIGNEDZEROFILL 之间没有先后顺序,主键 KEY 和 auto_increment 要放在UNSIGNED ZEROFIL ...