每日一题 为了工作 2020 0317 第十五题

/**
* 题目:删除链表的a/b处节点
* 给定链表的头节点 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, 不删除任何节点。
*
* 分析:
* 如何根据链表的长度n, 以及a与b的值决定该删除的节点是哪一个节点呢?
*
* 方法:
* 先计算doubler = ((double) (a * n)) / ((double) b)的值, 然后r向上取整之后的整数值代
*表该删除的节点是第几个节点。
*
* 例子:
*1.如果链表长度为7, a=5, b=7。
* r = (7*5)/7 = 5.0, 向上取整后为5, 所以应该删除第5个节点
*
*2.如果链表长度为7, a=5, b=6。
* r = (7*5)/6 = 5.8333 … , 向上取整后为6, 所以应该删除第6个节点。
*
*3.如果链表长度为7, a= 1, b=6。
* r = (7*1)/6 = 1.1666 … , 向上取整后为2, 所以应该删除第2个节点。
*
* @author 雪瞳
*
*/

public class Node<T> {
	public T value;
	public Node<T> next;
	public Node(T data){
		this.value = data;
	}
}

 

public class DeleteaBybNode {
	private Node cur;
	public Node deleteNodeByab(Node head,int a,int b) {
		if(head == null  || b==0) {
			return null;
		}
		if(a<1 || a>b) {
			return head;
		}
		int nodeLength =0;
		int index = 0;
		cur = head;
		//计算链表长度
		 while(cur!=null) {
			 nodeLength++;
			 cur = cur.next;
		 }
		//获取删除结点位置
		index = (int) Math.ceil((double)(nodeLength*a)/(double)b);
		if(index == 1) {
			head = head.next;
		}
		if(index > 1) {
			cur = head;
			//单链表找到要删除的前一个节点
			//若index = 3
			// head ->head.next->head.next.next->head.next.next.next
			// while循环前index的值
			// 2		1		 0
			//			cur
			//					 要删除的节点
			while(cur != null) {
				index --;

				if(index == 1) {
					//当index为1时说明cur是需要删除节点的前一个节点 直接移除cur的next节点即可
					cur.next = cur.next.next;
				}
				cur = cur.next;
			}
		}
		return head;
	}
}

  

import java.util.Random;
import java.util.Scanner;

public class testDeleteNodeByab {
	public static void main(String[] args) {
		DeleteaBybNode delete = new DeleteaBybNode();
		testDeleteNodeByab test = new testDeleteNodeByab();
		Random rand = new Random();
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入链表长度");
		int K = sc.nextInt();
		System.out.println("请输入a的值");
		int a =sc.nextInt();
		System.out.println("请输入b的值");
		int b =sc.nextInt();

		Node nodes[]=new Node[K];
		for(int i=0;i<nodes.length;i++) {
			nodes[i]=new Node(rand.nextInt(20)+1);
		}
		for(int i =0;i<nodes.length-1;i++) {
			nodes[i].next=nodes[i+1];
		}
		Node head = nodes[0];
		//test
		test.showNode(head);
		delete.deleteNodeByab(head, a, b);
		test.showNode(head);

	}
	public void showNode(Node head) {
		System.out.println("链表内的元素如下所示...");
		while(head != null) {
			System.out.print(head.value+"\t");
			head = head.next;
		}
		System.out.println();
	}
}

*运行结果

原文地址:https://www.cnblogs.com/walxt/p/12510018.html

时间: 2024-07-31 22:02:47

每日一题 为了工作 2020 0317 第十五题的相关文章

每日一题 为了工作 2020 0322 第二十题

/** * 问题: 判断一个链表是否为回文结构 * 给定一个链表的头节点head, 请判断该链表是否为回文结构. * * 例如: * 1->2->1, 返回 true. * 1->2->2-> 1, 返回 true . * 15->6-> 15, 返回 true. * 1->2->3, 返回 false. * * 解答: * 利用栈结构即可.从左到右遍历链表, 遍历的过程中把每个节点依次压入栈中. * 因为栈是先进后出的, 所以在遍历完成后, 从栈顶到

经典算法题每日演练——第二十五题 块状链表

原文:经典算法题每日演练--第二十五题 块状链表 在数据结构的世界里,我们会认识各种各样的数据结构,每一种数据结构都能解决相应领域的问题,每一种数据结构都像 是降龙十八掌中的某一掌,掌掌毙命... 当然每个数据结构,有他的优点,必然就有它的缺点,那么如何创造一种数据结构 来将某两种数据结构进行扬长避短,那就非常完美了.这样的数据结构也有很多,比如:双端队列,还有就是今天讲的 块状链表, 我们都知道 数组 具有 O(1)的查询时间,O(N)的删除,O(N)的插入... 链表 具有 O(N)的查询时

经典算法题每日演练——第十五题 并查集

原文:经典算法题每日演练--第十五题 并查集 这一篇我们看看经典又神奇的并查集,顾名思义就是并起来查,可用于处理一些不相交集合的秒杀. 一:场景 有时候我们会遇到这样的场景,比如:M={1,4,6,8},N={2,4,5,7},我的需求就是判断{1,2}是否属于同一个集合,当然实现方法 有很多,一般情况下,普通青年会做出O(MN)的复杂度,那么有没有更轻量级的复杂度呢?嘿嘿,并查集就是用来解决这个问题的. 二:操作 从名字可以出来,并查集其实只有两种操作,并(Union)和查(Find),并查集

code第一部分数组:第十五题 矩阵翻转(图像翻转)

code第一部分数组:第十五题 矩阵翻转(图像翻转) 首先想到,纯模拟,从外到内一圈一圈的转,但这个方法太慢.如下图,首先沿着副对角线翻转一次,然后沿着水平中线翻转一次. 源代码 #include <iostream> #include <vector> using namespace std; //引用类型形参 void swap(int &n,int &m) { int temp=n; n=m; m=temp; } //指针类型形参 void swap1(int

每日一题 为了工作 2020 0303 第一题

Java 栈的相关操作 题目 : * 实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作 * 要求 : * 1.pop.push.getMin操作的时间复杂度都是O(1). * 2.设计栈类型可以使用现成的栈结构. * 首先明确Java栈的相关操作函数 Stack stack = new Stack();//实例化栈对象 * 进栈操作 stack.push(“Object”);//返回的是入栈的内容 stack.add("Object");//返回的是true或

每日一题 为了工作 2020 0304 第二题

/** * 题目: * 编写一个类,用两个栈实现队列,支持队列的基本操作(add.poll.peek) * 分析: * 栈的特点是先进后出,而队列的特点是先进先出,我们可以用两个栈正好能把顺序 * 反过来实现类似队列的操作. * 具体实现是一个栈作为压入栈,在压入数据时只往这个栈中压入,记为stackPush, * 另一个栈只作为弹出栈,在弹出数据时只从这个栈弹出,记为stackPop. * 因为数据压入栈的时候,顺序是先进后出的,那么只要把stackPush的数据在压入 * stackPop中

每日一题 为了工作 2020 0305 第三题

/** * 问题: * 如何仅适用递归函数和栈操作逆序一个栈 * 一个栈依次压入1.2.3.4.5,那么从栈顶到栈底分别为5.4.3.2.1.将这个栈转置后, * 从栈顶到栈底为5.4.3.2.1,也就是实现了栈中元素的逆序,但是只可以通过递归函数来实现. * 分析: * 本题目考验查找操作和递归函数的设计,我们需要设计出两个递归函数. * 函数一:将栈stack中的栈底元素返回并移除 * getAndRemoveLastElement() * 函数二:逆序一个栈 * @author 雪瞳 *

每日一题 为了工作 2020 03019 第十七题

/** * 问题:反转双向链表 * * 要求: * 如果链表长度为 N,时间复杂度为O(N),额外的空间复杂度为O(1). * * @author 雪瞳 * */ public class Node<T>{ public T value; public Node next; public Node last; public Node(T data){ this.value =data; } } public class reverseList { private Node current =

每日一题 为了工作 2020 0323 第二十一题

/** * 题目:将单向链表按某值划分成左边小.中间相等.右边大的形式 * * 要求: * 给定一个单向链表的头节点 head, 节点的值类型是整型, 再给定一个整数 privot.实现 *一个调整链表的函数, 将链表调整为左部分都是值小于privot的节点, 中间部分都是值等于privot *的节点, 右部分都是值大于privot的节点.除这个要求外, 对调整后的节点顺序没有更多的要求. *例如: 链表 9->0->4->5->1, privot=3.调整后链表可以是1->