每日一题 为了工作 2020 0405 第三十四题

/**
* 问题: 向有序的环形单链表中插入新节点
* 一个环形单链表从头节点 head开始不降序, 同时由最后的节点指回头节点。给定这样
* 一个环形单链表的头节点 head和一个整数 num, 请生成节点值为 num的新节点,并插入到
* 这个环形链表中, 保证调整后的链表依然有序。
*
* 解题:
* 1. 生成节点值为 num的新节点, 记为 node。
* 2. 如果链表为空, 让 node自己组成环形链表, 然后直接返回node。
* 3. 如果链表不为空, 令变量 pre=head, cur=head.next, 然后令 pre和 cur同步
* 移动下去, 如果遇到 pre的节点值小于或等于 num,并且 cur的节点值大于或等于 num,说
* 明 node应该在 pre节点和 cur节点之间插入, 插入 node, 然后返回 head即可。
* 例如, 链表 1->3->4->1->… , num=2。应该把节点值为 2的节点插入到 1和 3之间 ,
* 然后返回头节点。
* 4. 如果 pre和 cur转了一圈, 这期间都没有发现步骤 3所说的情况,说明 node应该插入
* 到头节点的前面, 这种情况之所以会发生, 要么是因为 node节点的值比链表中每个节总的值
* 都大, 要么是因为 node的值比链表中每个节点的值都小。
* 分别举两个例子:
* 示例1, 链表 1->3->4->1->… , num=5, 应该把节点值为 5 的节点,插
* 入到节点1 的前面;
* 示例2, 链表 1->3->4->1->…, num=O, 也应该把节点值为 0 的节点,插
* 入到节点1 的前面。
* 5. 如果 node节点的值比链表中每个节点的值都大, 返回原来的头节点即可:如果 node节点
* 的值比链表中每个节点的值都小, 应该把 node作为链表新的头节点返回。
*
* @author 雪瞳
*
*/

*代码

public class Node {
	public int value;
	public Node next;
	public Node(int data){
		this.value=data;
	}
}

  

public class InsertCircleNodeList {

		public Node insertCircleNodeList(Node head,int num){

			Node newHead = null;
			Node insert = new Node(num);
			Node preCurrent = null;
			Node current = null;
			int flag = 0;
			if(head==null){
				insert.next=insert;
				return insert;
			}

			preCurrent = head;
			current = head.next;
			while(current != head){
				if(preCurrent.value <= num && num <=current.value){
					preCurrent.next=insert;
					insert.next=current;
					flag = 1;
				}
				preCurrent=current;
				current=current.next;
			}
			if(flag == 0){
				insert.next=head;
				preCurrent.next=insert;

				if(head.value>num){
					return insert;
				}else if(head.value<num){
					return head;
				}
			}
			return head;
		}
}

  

public class TestInsertCircleNodeList {

	public static void main(String[] args) {
		TestInsertCircleNodeList test = new TestInsertCircleNodeList();
		InsertCircleNodeList insert = new InsertCircleNodeList();

		Node n1 = new Node(1);
		Node n2 = new Node(2);
		Node n3 = new Node(3);
		Node n4 = new Node(4);
		Node n5 = new Node(6);

		n1.next = n2;
		n2.next = n3;
		n3.next = n4;
		n4.next = n5;
		n5.next = n1;

		Node head = n1;
		test.showNodeList(head);
		Node result = insert.insertCircleNodeList(head, 5);
		test.showNodeList(result);

	}

	public void showNodeList(Node head){
		int flag = 0;
		Node current = head.next;
		System.out.println("链表内元素如下...");
		System.out.print(head.value+"\t");
		while(current!=head){
			flag ++;
			System.out.print(current.value+"\t");
			current = current.next;
			if(flag == 5){
				System.out.println();
			}
		}
		System.out.println();
	}
}

  

*运行结果

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

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

每日一题 为了工作 2020 0405 第三十四题的相关文章

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

/** * * 问题:合并两个有序的单链表 * 给定两个有序单链表的头节点 head1和head2, 请合并两个有序链表, 合并后的链表依然有序, * 并返回合并后链表的头节点. * 例如: * 0->2->3->7->null * 1->3->5->7->9->null * 合并后的链表为: 0-> 1->2->3->3->5->7->7->9->null * * 解答: * 1.如果两个链表中有

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

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

LeetCode第三十四题-寻找数组中对应目标值的首尾索引

Find First and Last Position of Element in Sorted Array 问题简介:给定按升序排序的整数数组,找到给定目标值的起始位置和结束位置. 注: 1.算法的运行时复杂度必须为O(log n) 2.如果在数组中找不到目标,则返回[-1,-1] 举例: 1: 输入: nums = [5,7,7,8,8,10], target = 8 输出: [3,4] 2: 输入: nums = [5,7,7,8,8,10], target = 6 输出: [-1,-1

工作那些事(三十四)杂记

最近一段时间,确实挺忙.有很多事情需要梳理,还有很多事情需要权衡.在抉择的过程中是痛苦的. 有的时候,即使内心在滴血,也要表现的很积极,很开心,因为有的时候,你的消极会影响到其他人: 有的时候,看起来,嘻嘻哈哈,但其实内心深处痛着,也许这就是痛并快乐着吧: 有的时候,当你站在海边,山上,你会觉得自己是多么的渺小: 有的时候,当你纠结在某些事情取舍的时候,其实很多时候,我们都很难承认自己之前的选择是错误的,就这样,为了让自己之前的选择是正确的,就会再次做出错误的选择,即使自己认为是错误的,这不是虚

经典算法题每日演练——第二十四题 梳排序

原文:经典算法题每日演练--第二十四题 梳排序 这篇再看看一个经典的排序,梳排序,为什么取名为梳,可能每个梳都有自己的gap吧,大梳子gap大一点,小梳子gap小一点. 上一篇我们看到鸡尾酒排序是在冒泡排序上做了一些优化,将单向的比较变成了双向,同样这里的梳排序也是在冒泡排序上做了一些优化. 冒泡排序上我们的选择是相邻的两个数做比较,就是他们的gap为1,其实梳排序提出了不同的观点,如果将这里的gap设置为一定的大小, 效率反而必gap=1要高效的多. 下面我们看看具体思想,梳排序有这样一个1.

code第一部分:数组 第十四题 雨水问题

code第一部分:数组 第十四题 雨水问题 Given n non-negative integers representing an elevation map where the width of each bar is 1, computehow much water it is able to trap after raining.For example, Given [0,1,0,2,1,0,1,3,2,1,2,1], return 6. 分析: 解决方案1 对于每个柱子,找到其左右两

工作那些事(三十二)由孙悟空的两个故事谈个人与团队

故事一: 话说唐太宗为了节省开支,西天取经项目需要裁员,接到通知的唐僧骤然头大,不知如何是好. 有人说: 先把猴子开了,因为不服从管理,再把沙僧开了,因为没有主见,再把猪开了, 因为猪肉比较贵,直接杀了卖钱,再把自已开了,因为没本事去,小白龙留下,因为有后台. 但是: 猴子是不能开的,猴子是团队中的精英,也就是大牛. 小白龙是不能开的,他是唐僧的座驾,是他身份的象征. 猪也是不能开的,对团队的氛围有重要作用. 最后 只能开掉沙僧 虽然他做事很多. 重要的是四种人: 1 唐僧:钦定的项目经理,虽然

网络流二十四题

网络流二十四题 网络流是个好东西,希望我也会. 网络流?\(orz\ zsy!!!!!\) P2766 最长不下降子序列问题 考虑我们是如何\(dp\)这个\(LIS\)的. 我们是倒着推,设置\(dp(i)\)代表以\(i\)为起点的\(LIS\)是多少.转移太显然了 \[ dp(i)=max\{dp(j)\}+1,data[i]\le data[j] \] 想一想一个合法的\(LIS\)方案代表着什么,代表着它是由这个式子一个一个推出来的. 考虑一个数字只能用一次,那么我们直接拆成两个点\(

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

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