《程序员代码面试指南》第二章 链表问题 删除中间节点和a/b处节点
题目
例如 1-2-3-4 删除2,1-2-3-4-5 删除3
例如 a=1,b =2
java代码
/**
* @Description:删除中间节点和a/b处节点
* @Author: lizhouwei
* @CreateDate: 2018/4/6 10:12
* @Modify by:
* @ModifyDate:
*/
public class Chapter2_3 {
//删除中间节点
public Node removeMidNode(Node head) {
if (head == null || head.next == null) {
return null;
}
Node node1 = head;
Node node2 = node1.next.next;
//获取中间节点的前驱节点 ,因为让node2早走一步,当node2走完时,node1刚好是中间节点的前驱节点
while (node2.next != null && node2.next.next != null) {
node1 = node1.next;
node2 = node2.next.next;
}
node1.next = node1.next.next;
return head;
}
//删除a/b处的节点
public Node removeNodeByRatio(Node head, int a, int b) {
if (head == null) {
return null;
}
Node cur = head;
int len = 0;//节点长度
while (cur != null) {
len++;
cur = cur.next;
}
//边界检查
if (a < 0 || b <= 0) {
return head;
}
int k = (int)Math.ceil((double)(a* len)/(double)b);
//如果k==1 说明a/b处是头节点
if (k == 1) {
head = head.next;
}
if(k>1){
cur =head;
//提前减一,这样当k=1时,节点为 k处的前驱节点
while (--k!=1){
cur = cur.next;
}
cur.next = cur.next.next;
}
return head;
}
public void printLink(Node head) {
System.out.println();
while (head != null) {
System.out.print(head.vlaue + " ");
head = head.next;
}
}
//测试
public static void main(String[] args) {
Chapter2_3 chapter = new Chapter2_3();
Link link1= new Link();
Link link2= new Link();
//构造两个链表
for (int i = 10; i >0 ; i--) {
link1.add(i);
link2.add(i);
}
chapter.printLink(link1.head);
Node head1= chapter.removeMidNode(link1.head);
chapter.printLink(head1);
chapter.printLink(link2.head);
Node head2= chapter.removeNodeByRatio(link2.head,1,2);
chapter.printLink(head2);
}
}
《程序员代码面试指南》第二章 链表问题 删除中间节点和a/b处节点的更多相关文章
- 程序员代码面试指南 IT名企算法与数据结构题目最优解
原文链接 这是一本程序员面试宝典!书中对IT名企代码面试各类题目的最优解进行了总结,并提供了相关代码实现.针对当前程序员面试缺乏权威题目汇总这一痛点,本书选取将近200道真实出现过的经典代码面试题,帮 ...
- 《程序员代码面试指南》第二章 链表问题 在单链表和双链表中删除倒数第K个节点
题目 在单链表和双链表中删除倒数第K个节点 java代码 /** * @Description:在单链表和双链表中删除倒数第K个节点 * @Author: lizhouwei * @CreateDat ...
- 《程序员代码面试指南》第三章 二叉树问题 遍历二叉树的神级方法 morris
题目 遍历二叉树的神级方法 morris java代码 package com.lizhouwei.chapter3; /** * @Description:遍历二叉树的神级方法 morris * @ ...
- [程序员代码面试指南]链表问题-将单链表的每k个节点之间逆序
题目描述 给定一个单链表的表头节点head,实现一个调整单链表的函数,是的每k个节点之间逆序,如果最后不够k个节点一组,则不调整最后几个节点. 题解 内部函数reverse实现链表beg到end的翻转 ...
- 左神算法书籍《程序员代码面试指南》——2_03删除链表的中间节点和a/b处的节点
[题目]给定链表的头节点head,实现删除链表的中间节点的函数.例如:不删除任何节点:1->2,删除节点1:1->2->3,删除节点2:1->2->3->4,删除节 ...
- 左神算法书籍《程序员代码面试指南》——2_02在单链表和双链表中删除倒数第k个字节
[题目]分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点.[要求]如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1).[题解]从头遍历链表, ...
- 程序员代码面试指南:IT名企算法与数据结构题目最优解
第1章栈和队列 1设计一个有getMin功能的栈(士★☆☆☆) 1由两个栈组成的队列(尉★★☆☆) 5如何仅用递归函数和栈操作逆序一个栈(尉★★☆☆) 8猫狗队列(士★☆☆☆)10用一个栈实现另一 ...
- 左神算法书籍《程序员代码面试指南》——3_05Morris遍历二叉树的神级方法【★★★★★】
[问题]介绍一种时间复杂度O(N),额外空间复杂度O(1)的二叉树的遍历方式,N为二叉树的节点个数无论是递归还是非递归,避免不了额外空间为O(h),h 为二叉树的高度使用morris遍历,即利用空节点 ...
- [程序员代码面试指南]二叉树问题-在二叉树中找到两个节点的最近公共祖先、[LeetCode]235. 二叉搜索树的最近公共祖先(BST)(非递归)
题目 题解 法一: 按照递归的思维去想: 递归终止条件 递归 返回值 1 如果p.q都不在root为根节点的子树中,返回null 2 如果p.q其中之一在root为根节点的子树中,返回该节点 3 如果 ...
随机推荐
- HTTP图解--了解Web及网络基础
1.网络基础TCP/IP 通常使用的网络是在TCP/IP协议族的基础上运行的,http属于它内部的一个子集. TCP/IP协议族按层次分别分为:应用层.传输层.网络层和数据链路层.分层的好处在于各司其 ...
- Linux Mint (应用软件— 虚拟机:Virtualbox)
近期想自己折腾一下Linux系统本身.比方Linux裁减或者移植.裁减或者移植Linux是一件麻烦的事情.而且出错后会影响到当前的系统.怎样才干不影响当前机器上的系统呢,于是便想到了虚拟机.在当前系统 ...
- 涛哥的Python工具箱之批量删除含指定字符串行
我们在软件研发中不可避免的要用到大量的反复性的繁琐的工作,比如批量改动代码中接口的字符串.批量下载文件并又一次按规则命名.这些工作人工做特别累,尤其是对我这样的懒人来说. 对于一个出色的程序猿来说,反 ...
- 基于Ranking-CNN的年龄识别(CVPR_2017)
作为学习记录,将所做PPT摘录如下:
- Atitit.dart语言的特性 编译时js语言大总结
Atitit.dart语言的特性 编译时js语言大总结 1. 原型环境1 1.1. Dart可以编译js3 2. 第二个期待的理由是Dart的语言特性,没有什么特别特性好像,类似java c#一小时 ...
- IDC机房带宽突然暴涨问题!
IDC机房带宽突然暴涨问题! 1[提出问题] [实际案例一] 凌晨3:00点某公司(网站业务)的一个IDC机房带宽流量突然从平时高峰期150M猛增至1000M,如下图: 该故障的影响:直接导致数百台服 ...
- jquery的on()
定义和用法 on() 方法在被选元素及子元素上添加一个或多个事件处理程序. 自 jQuery 版本 1.7 起,on() 方法是 bind().live() 和 delegate() 方法的新的替代品 ...
- Android Activity去除标题栏和状态栏
一.在代码中设置public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //去除ti ...
- vmware workstation导出ovf
ovf tool路径 /Applications/VMware Fusion.app/Contents/Library/VMware OVF Tool 上面红色的部分,需要右键点击应用程序中的VMwa ...
- Openstack(Kilo)安装系列之环境准备(一)
本文采用VMware虚拟环境,使用CentOS 7.1作为openstack的基础环境. 一.基础平台 1.一台装有VMware的windows系统(可联网) 2.CentOS 7.1 64bit镜像 ...