单向链表
addFirst方法
遍历链表
一
二
三
Test类e
1.关于为什么在中间值不使用middle=(left+right)/2;
因为Java中使用 在Java中,进行二分查找时,直接使用 可能会遇到整数溢出的问题。这是因为当 和 都非常大且接近 时,它们的和可能会超过 类型的最大值,从而导致溢出。
改进版
int middle = left + (right - left) / 2;
无符号右移一位相当于除以2向下取整
那么
int middle = left +right >>> 1;
2.关于为什么使用left<=right去作为判断跳出循环的条件而不是去用left<right去作为判断的条件
如果使用 left < right 作为条件,那么在最后一次迭代中,当 left 和 right 相邻时(即 left = right - 1),循环就会提前终止,从而可能错过目标元素(如果它正好位于 left 或 right 指向的位置)。
left ==right 意味着它们指向的元素也会参与比较,left < right 只意味着middle指向的元素参与比较
核心为将right不作为比较元素
该写法的特点:
i,j 对应着搜索区间 [0,a.length)(注意是左闭右开的区间),i<j 意味着搜索区间内还有未比较的元素,j 指向的一定不是查找目标
思考:为啥这次不加 i==j 的条件了?
回答:这回 j 指向的不是查找目标,如果还加 i==j 条件,就意味着 j 指向的还会再次比较,找不到时,会死循环
1)令right为arr.length是确定right为数组边界外一值并不是数组中的值不希望right参与比较,在其中left是参加比较的值而right是不参与比较的值
使得在target在小于arr[middle]时令right=middle
2)关于循环跳出条件为left<right的原因
当查找的数没有在数组中时会进行死循环报错
问题切入点:
l为总循环次数,当元素在最右边与最左边时的循环次数不一致。在最右边要进行2*l次比较
时间复杂度都为log(n)。
核心为进行两分支(if else),比较一次,在循环中只是缩小范围不进行返回值
注意判断循环条件为(left+1<right)
关于使用Java自身提供的区别在于返回值当查询不到数据时返回的是-(插入值+1)
return -(low + 1); // key not found.
eg 当我的数组为{1,23,45,77,123}时我查找12时就会返回-2(因为12拍数组第二所以-(1+1)=-2)
返回-2
实现查找重复数字中最左边序号
实现查找重复数字中最右边序号
区别:在边界处不同
// 继续向右搜索,直到找到最右边的位置
left = middle + 1;
对于Leftmost与Rightmost,可以返回一个比-1更有用的值
Leftmost改为
- Leftmost返回值的另一层含义:小于target的元素个数,≥target的最靠左索引
- 小于等于中间值,都要向左找
Rightmost改为
- Rightmost返回值的另一层含义:≤target的最靠右索引
- 大于等于中间值,都要向右找
范围查询
查询x<4,0...leftmost(4) - 1
查询x ≤ 4,0...rightmost(4)
查询4 < x,rightmost(4) + 1 ... infty
查询4 ≤ x,leftmost(4) ... infty
查询4 ≤ x ≤ 7,leftmost(4) ... rightmost(7)
查询4 < x < 7,rightmost(4) + 1 ... leftmost(7) - 1
求排名:leftmost(target) + 1
求前任:leftmost(target) - 1
求后任:rightmost(target) + 1
rightmost(5) + 1 = 5,后任a[5] = 7
rightmost(4) + 1 = 5,后任a[5] = 7
求最近邻居
前任和后任距离更近者
到此这篇单向链表排序java(单链表排序 java)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/jjc/82392.html