合并有序链表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/**
* 两条有序列表合并之后仍然有序
* 同时不断遍历两个链表,取出小的追加到新的头节点后,直至两者其中一个为空
* 再将另一者追加的新链表最后
*
* @return 两个有序的链表合并后得到的链表
*/
public static Node mergeOrderedLinkedList(Node p1, Node p2) {
// 创建一个头节点
Node head = new Node();
// 尾指针指向头节点
Node tail = head;
// 遍历两个链表,短的链表接受后循环停止
while (p1 != null && p2 != null) {
// 比较两个链表中的节点
// 如果链表1的当前节点小
if (p1.data < p2.data) {
// 小的链表1的当前节点连接到尾节点上。
tail.next = p1;
// 链表1的当前节点已经连接到结果链表上了,
// 链表1的当前节点向前走一步
p1 = p1.next;
} else {
// 如果是链表2的当前节点比较小
// 把链表2的当前节点接到合并链表的尾节点上
tail.next = p2;
// 链表2的当前节点向前走一步
p2 = p2.next;
}
// 合并链表尾指针向前走一步
tail = tail.next;
}
// 长的链表剩下的部分接到尾节点上
tail.next = (p1 == null) ? p2 : p1;
return head.next;
}

测试

1
2
3
4
5
6
7
8
int[] a = { 1, 4, 5, 8, 9 };
int[] b = { 2, 3, 6, 7, 10, 11, 12 };
Node nodeA = Node.createLinkByTail(a);
Node nodeB = Node.createLinkByTail(b);
Node.printNode(nodeA);
Node.printNode(nodeB);
Node mernNode = Node.mergeOrderedLinkedList(nodeA, nodeB);
Node.printNode(mernNode);

运行结果:

1
2
3
head-->1-->4-->5-->8-->9
head-->2-->3-->6-->7-->10-->11-->12
head-->1-->2-->3-->4-->5-->6-->7-->8-->9-->10-->11-->12

颠倒上面的数组的循序:

1
2
int[] b = { 1, 4, 5, 8, 9 };
int[] a = { 2, 3, 6, 7, 10, 11, 12 };

再次运行:
运行结果:

1
2
3
head-->2-->3-->6-->7-->10-->11-->12
head-->1-->4-->5-->8-->9
head-->1-->2-->3-->4-->5-->6-->7-->8-->9-->10-->11-->12

参考资料

https://medium.com/@bittigermanager/%E7%AE%97%E6%B3%95%E5%85%A5%E9%97%A8%E5%BF%85%E8%AF%BB-merge-two-sorted-lists-%E5%90%88%E5%B9%B6%E4%B8%A4%E4%B8%AA%E6%9C%89%E5%BA%8F%E9%93%BE%E8%A1%A8-b3d64661657b

https://blog.csdn.net/biezhihua/article/details/79935765

Java代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/**
* 删除所有查找到的节点
*
* @param head 链表的头指针
* @param data 要删除的节点的数值
* @return 删除链表中的所有符合的节点后的链表的头指针。
*/
public static Node delectAllNodeInLink(Node head, int data) {
// 要删除的是头节点的情况
while (head.data == data) {
// 头指针后移,越过该节点
head = head.next;
}
// 如果要删除的是中间的节点
// 没有重复的前一个节点的指针
Node p = head;
// 当前节点的指针
Node c = p;
// 当前节点的后面还有节点时
while (c.next != null) {
// 当前节点向前走一步
c = c.next;
if (c.data == data) {
// 断开前面的链表与当前链表的连接
p.next = null;
// 当前节点后面的链表接到当前节点前面的链表的尾巴上
p.next = c.next;
} else {
// 保存下当前遍历的节点,以便下次遍历的时候知道它上一个节点是谁
p = c;
}
}
return head;
}

问题描述

今天我调整了Path环境变量的顺序,当我想再次编辑Path环境变量的时候,显示的不是列表,而是一个文本框:

image-20210729123502151

原因:第一个地址以%开头造成的

这是因为Path环境变量的第一个地址以%开头造成的

解决方案:让第一个地址以盘符开头

赋值path的值

全选,复制path的值。

1
%JAVA_HOME%\bin;%NVM_HOME%;%NVM_SYMLINK%;%NVM_HOME%\nodejs\node_global;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\\Users\\haha\AppData\Local\Microsoft\WindowsApps;F:\Program Files (x86)\NetSarang\Xshell 7\;E:\dev2\mysql5.58\mysql5.5.8\bin;E:\快捷方式;F:\Program Files (x86)\NetSarang\Xftp 7\;F:\Program Files\scrcpy-win64-v1.18;F:\Program Files\Graphviz\bin;G:\Program Files\Microsoft VS Code\bin;G:\Program Files\Git;G:\dev2\idea_workspace\HexoTools\runable;G:\Program Files\Git\cmd;G:\apache-tomcat-8.5.35\bin;

调整path变量的顺序

拆分成多行显示

打开一个文本编辑软件,把;替换成;\n,然后把百分号开头的移动到最后面:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
C:\Windows\system32;
C:\Windows;
C:\Windows\System32\Wbem;
C:\Windows\System32\WindowsPowerShell\v1.0\;
C:\Windows\System32\OpenSSH\;
C:\\Users\\haha\AppData\Local\Microsoft\WindowsApps;
F:\Program Files (x86)\NetSarang\Xshell 7\;
E:\dev2\mysql5.58\mysql5.5.8\bin;
E:\快捷方式;
F:\Program Files (x86)\NetSarang\Xftp 7\;
F:\Program Files\scrcpy-win64-v1.18;
F:\Program Files\Graphviz\bin;
G:\Program Files\Microsoft VS Code\bin;
G:\Program Files\Git;
G:\dev2\idea_workspace\HexoTools\runable;
G:\Program Files\Git\cmd;
G:\apache-tomcat-8.5.35\bin;
%JAVA_HOME%\bin;
%NVM_HOME%;
%NVM_SYMLINK%;
%NVM_HOME%\nodejs\node_global;

调整顺序后再合并成一行

最后再把;\n,替换成;

1
C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\\Users\\haha\AppData\Local\Microsoft\WindowsApps;F:\Program Files (x86)\NetSarang\Xshell 7\;E:\dev2\mysql5.58\mysql5.5.8\bin;E:\快捷方式;F:\Program Files (x86)\NetSarang\Xftp 7\;F:\Program Files\scrcpy-win64-v1.18;F:\Program Files\Graphviz\bin;G:\Program Files\Microsoft VS Code\bin;G:\Program Files\Git;G:\dev2\idea_workspace\HexoTools\runable;G:\Program Files\Git\cmd;G:\apache-tomcat-8.5.35\bin;%JAVA_HOME%\bin;%NVM_HOME%;%NVM_SYMLINK%;%NVM_HOME%\nodejs\node_global;

粘贴回path变量值

再粘贴会path的文本框即可。

还需要注意的是,直接粘贴,可能不会改变Path的值,应该先删除path的值,清空里面的内容,再进行粘贴

列表形式

这样再次编辑path显示的就是列表形式的了:
image-20210729123536129

Web

软件架构

C/S架构

好处

可以调用计算机的本地资源

缺点

更新维护麻烦,更新的话需要重新下载安装客户端。

B/S

CSS

DIV+CSS布局

ajax

HTML5

Web服务端发展

PHP 1994

ASP VBScript语言开发
aspx C#开发

Servlet 1997
JSP 1998

MVC 2000年

Spring 2001年

Node.js 2009年

HBuilder

HTML

超链接

绝对路径
相对路径

前言

之前我一直使用的数据线来连接手机的,有线的优点是速度快。
但是这几天我使用数据线遇到了麻烦,由于我手机永久了,usb接口接触不良。连接有时候好,有时候又断开。
使用无线连接就有这种问题。

阅读全文 »

java代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
/**
* 从链表中删除一个节点
*
* @param head 链表的头指针
* @param data 要删除的节点中的数据
* @return 删除指定节点后的链表的头指针。
*/
public static Node deleteNodeInLink(Node head, int data) {
// 如果要删除的是头节点
if (head.data == data) {
// 头指针向后移动一格,越过头节点,也就从链表中删除该节点
head = head.next;
return head;
}
// 如果不是头节点
// 当前遍历的节点的前一个节点
Node previous = head;
// 当前遍历的节点
Node current = previous;
// 如果当前节点后面有节点的话
while (current.next != null) {
// 移动到后一个节点
current = current.next;
// 如果找到要删除的节点
if (current.data == data) {
// 前面的链表 断开与要删除的节点的之间的连接
previous.next = null;
// 把要删除的节点后面的节点接到它前面的节点上
previous.next = current.next;
// 断开要删除的节点和它后面的节点之间的连接
current.next = null;
// 已经删除好了,退出
return head;
} else {
previous = current;
}
}
return head;
}

问题描述

eclipse中,向下复制一行的快捷键为Ctrl+Alt+Down快捷键,但是按下这个快捷键会造成屏幕的显示方向上下颠倒。

解决方案!

修改eclipse向下复制一行的快捷键为其他快捷键

解决方案2

禁用与eclipse冲突的软件的快捷键
这里冲突的是 英特尔核芯显卡控制面板 这个软件的的图形选项的快捷键:

image-20210728202935223

如何禁用win10的Ctrl+Alt+Down快捷键

桌面空白处,按下鼠标右键,然后选择图形选项,然后选择快捷键,最后勾选禁用即可。
如下图所示:

image-20210728202253098

倒置链表

  • 创建一个新的链表
  • 遍历原来的链表,找到最后一个节点(最后.next==null),
  • 然后断开最后一个节点与原来的链表的连接(倒数第二.next==null),
  • 接着把最后一个节点,放到新链表的尾部。

java代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
/**
* 颠倒链表,使得链表的尾部变成头部
*
* @param head 链表头节点的引用
* @return 颠倒后的链表的头节点的地址
*/
public static Node invertLink(Node head) {
// 颠倒后的新链表的头节点
Node newHead = null;
// 颠倒后的新链表的尾节点
Node newTail = null;
// 倒数第二个节点
Node secondToLast = null;
// 最后一个节点
Node last = null;
// 如果头节点后面还有节点的话
while (head.next != null) {
// 查找倒数第2的节点
secondToLast = findSecondToLastNode(head);
// System.out.print("倒数第2=" + secondToLast.data);
// 倒数第1个节点
last = secondToLast.next;
// System.out.println(",倒数第1=" + last.data);
// 断开最后一个节点
secondToLast.next = null;

if (newHead == null) {
// 第一次断开的尾节点,作为新链表的头节点。
newHead = last;
newTail = last;
} else {
// 旧链表的尾节点作为新链表的尾节点
newTail.next = last;
// 新加入的节点作为尾节点
newTail = newTail.next;
}
}
last=null;
secondToLast=null;
// 处理旧链表的最后一个节点,也就是头节点
// 头节点作为最后的尾节点
newTail.next = head;
// 新加入的节点作为尾节点
newTail = newTail.next;
// 原来的头指针断开与头节点的连接
head = null;
// 返回新链表的头节点
return newHead;
}

/**
* 查找倒数第2的节点
*
* @param head 链表的头节点的引用
* @return 链表倒数第二节点的引用
*/
private static Node findSecondToLastNode(Node head) {
Node p = head;
while (p.next.next != null) {
p = p.next;
}
return p;
}

链表倒置代码执行示意图

原来的链表

创建新链表的头指针和尾指针

在旧链表中查找倒数第二个节点,并通过倒数第2个节点得到倒数第1个节点

断开原来链表中尾节点

原来链表中的尾节点作为新链表的头节点以及尾节点

再次查找出旧链表的倒数第二个节点

断开旧链表的最后一个节点

摘下的节点连接到新链表的尾部

新插入的节点作为新链表的尾节点

查找旧链表中倒数第二个节点

10:摘下最后一个节点

11:摘下的节点连接到新链表的尾部

12:新节点作为尾节点

13:查找链表中倒数第2个节点

14:摘下旧链表中的最后一个节点

15:新节点连接到新链表的尾部

16:新节点作为新链表的尾节点

17:倒数第1,倒数第2指针置空

18:旧链表的头节点连接到新链表的尾部

19:设置新插入的节点为尾节点,然后断开旧链表的头指针与该节点的连接。

20:得到反转之后的新链表

使用反射拼接要SQL语句

获取类名,字段名,值

根据反射拼接一个对象的insert语句

好处是,所有的对象都可以通用。

根据反射拼接出带占位符?的insert语句

System.arrayCopy方法

根据反射打印对象(类似select语句的输出形式)

ResultSet中的行,转换为对象

使用反射 删除对象对应的表记录

使用反射 更新 表中的记录

使用配置文件保存数据库的

用户名和密码

数据库连接池

使用队列来保存连接,使用的时候从队列中拿,使用完毕之后再放入到队列之中。

导出jar包

可运行的包和普通jar包

后续
数据库作业
数据结构
ORM工具

分层

尾插法创建链表示意图

Node head=null;
Node tail=null;
Node node1=null;

node1=new Node(1);

head=node1;
tail=node1;

node1=new Node(2);

tail.next=node1;

tail=node1;

node1=new Node(3);

tail.next=node1

tail=node1

node1=new Node(4)

tail.next=node1

tail=node