文章目录
1.Algorithm
1.1 删除链表中的节点
请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点。
现有一个链表 – head = [4,5,1,9],它可以表示为:
示例 1:
输入: head = [4,5,1,9], node = 5
输出: [4,1,9]
解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.
示例 2:
输入: head = [4,5,1,9], node = 1
输出: [4,5,9]
解释: 给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9.
说明:
链表至少包含两个节点。
链表中所有节点的值都是唯一的。
给定的节点为非末尾节点并且一定是链表中的一个有效节点。
不要从你的函数中返回任何结果。
解题思路:
一般来说是通过当前节点的head找到上一节点,再加上一节点指向当前节点的下一节点;但是这道题无论如何也找不到head节点。
但是题目中的非末尾
节点这个描述很值得注意;实际做法就是将下一节点的内容赋值到当前节点,再删除下一节点即可。
node=node.next这样不会对链表产生影响吗?因为这样只是改变了node的指向,而不是去修改node所指向地址的内容,所以返回到原链表中就不会影响。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public void deleteNode(ListNode node) {
node.val = node.next.val;
node.next = node.next.next;
}
}
2.Review
3.Tip
3.1 新增/修改 保证数据唯一
数据库主键是pkid,然后业务上的主键是hrid和checker_type
在新增时,通过hrid和checker_type查找数据库中数据条数
在修改时,通过数据库主键pkid排除本身,然后再通过hrid和checker_type来查找
<select id="selectExistsCount" resultType="Integer" parameterType="com.aerocloud.entity.QlfHrCheckEntity">
SELECT count(*) FROM qlf_hr_check
WHERE hrid = #{hrid}
AND checker_type = #{checkerType}
<if test="pkid != null and pkid != ''">
AND pkid != #{pkid}
</if>
</select>
3.2 oralce中的空字符串''
和null
以下sql执行后数据库中的值为`null`
```sql
insert into table_name(colum) values('')
数据库中保存的内容中只有null
,没有空字符串''
;
但是在SQL中是有null
和空字符串''
的区分
SELECT NVL(NULL,1) FROM DUAL; //1
SELECT NVL('',1) FROM DUAL; //1
书写SQL时,null和任何值都不能比计较,除非使用is null
/is not null
,否则使用比较符的时候会将为null
的值过滤掉
''
是可以使用比较符的,如下:
SELECT case
when nvl(null, '') = '' then
1 else 2
end
FROM DUAL;
//2
4.Share 线程
4.1线程的创建方式:
- 实现Runnable接口的run方法
- 继承Thread类并重写run方法
- 使用FutureTask方式
4.2线程中的方法:
- Object对象,作为共享变量(锁),调用以下方法
- wait():释放锁(必须获得锁才能调用),进入等待状态;
- notify():唤醒在wait状态的线程
- notifyAll():唤醒所有在wait状态的线程
- Thread类
- Thread.sleep():当前线程进入等待状态,等待n秒后继续;(不会释放锁,也不用获得锁后去调用)。
- Thread.yield():当前线程让出CPU执行权,线程调度器将CPU时间分配给其它线程,也可能是它本身
- Thread对象
- join():在主线程中的Thread对象调用该方法,等待Thread对象线程执行完毕
4.3 线程的状态
- New(新创建)
- Runable(可运行)
- Blocked(被阻塞):获取对象锁
- Waiting(等待):wait,join等
- Timed waiting(计时等待):调用有超时参数的方法时
- Terminaed(被终止):run方法正常退出、未捕获异常
4.4 线程中断
- void interrept():设置中断标志为true
- boolean isInterrupted():检测是否中断
- static boolean interrupted():检测当前线程是否中断。
Thread.interrupted()
和threadOne.interrupted()
,Thread是主线程,threadOne是子线程,两者在主线程中调用返回的都是主线程的中断标志 - boolean isInterrupted(boolean bool):isInterrupted和interrupted内部都是调用该方法,分别传入false(不清除中断标志),true(清除中断标志);清除中断标志就是将中断标志置为false