0%

分隔链表

给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。

你应当保留两个分区中每个节点的初始相对位置。

示例:

输入: head = 1-4-3-2-5-2, x = 3 输出: 1-2-2-4-3-5

题目分析

  1. 直接思路是第一次遍历找到中间节点,并且划分为左右两边,然后再重新遍历链表元素,按大小分类到两边去。
  2. 但这样要来回遍历链表,还要不停的交换节点很麻烦,换个逆向思路:既然是一个链表分成两个区域,不就相当于两个链表合成一个区域
  3. 因此,即构造两个链表,遍历原链表元素,分类接在两个链表上。
  4. 遍历结束合成两个链表。

题解代码

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
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* partition(ListNode* head, int x)
{
//逆向想问题,既然分成了两段,那也可以是两段连成了一段

ListNode lefthead(0);
ListNode* left=&lefthead;
ListNode righthead(0);
ListNode* right=&righthead;


while(head!=NULL)
{
if(head-val<x)
{
left-next=head;
left=left-next;
}
else
{
right-next=head;
right=right-next;
}
head=head-next;


}
right-next=NULL;//注意赋值null,否则下面的链表连接会无限循环超时
left-next=righthead.next;
return lefthead.next;


}
};

反转链表

反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。

说明: 1 ≤ m ≤ n ≤ 链表长度。

示例:

输入: 1-2-3-4-5-NULL, m = 2, n = 4 输出: 1-4-3-2-5-NULL

题目分析

  1. 反转一段区域,首先肯定想到是一个一个反转 比如2-3-4 先3插前面去 3-2-4 ,然后4插前面去 4-3-2
  2. 怎么移过去呢?观察这个局部链表,可以知道我们每次把要处理的插入到链表头即可。
  3. 因此保留一个pre指向反转区域头部,例如示例中是1
  4. 遍历反转区域元素current,令temp=current-next保存下位,处理好current的前后指向关系,然后把temp插入到链表头,即pre-next即可。

题解代码

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
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int m, int n)
{
int count=1;
ListNode* temp;
ListNode* current;

ListNode First(0);
First.next=head;
ListNode* pre=&First;
while(count<m)//pre停在原第m-1个数
{
pre=pre-next;
count++;
}
current=pre-next;//current指向当前处理数

while(count<n)//count计数位,每次将current-next插入到pre-next,相当于利用pre做了个栈,[1,2,3,4,5]为例 current=2 pre=1
{
temp=current-next;//保留current后节点,temp=3
current-next=temp-next;//2-next=4
temp-next=pre-next;//逆转temp和current的前后关系。3-next=2
pre-next=temp;//更新pre的后节点,1-next=3
//current
count++;//完成[1,3,2,4,5]
}

return First.next;

}
};

问题

前几天win10系统更新到了1909,打开VMware 15.0.2时系统通知该版本可能无法运行= =没管它开了虚拟机,结果就是虚拟机黑屏卡死,vm工作台无法结束,后台vmware-vmx进程拒绝访问

解决步骤

  1. 打开windows【服务】面板

    1.1 可以WIN+R 输入 services.msc 打开

    1.2 也可以在win10的搜索框中直接搜索 “服务”

  2. 按【v】键,快速找到vmware相关服务,全部 右键-属性-禁用,且停止运行。

  3. 全部停止运行后,任务管理器已经可以关掉vm的主进程,但其实后台还有一个vmware-vmx没关掉,也关不掉。

  4. 此时【重启】电脑,注意是重启,不是关机再开机,可以发现vmware-vmx已经没有了

  5. 但和其他博客说的不同,此时恢复vmware相关服务,再开虚拟机一样是卡死,同样的问题。

  6. 因此打开vmware的安装程序,准备修复,先别点下修复= =(文件夹里找,或者控制面板-卸载或更改程序里找)

  7. 我修复运行的时候,提示无法写入文件glib-2.0.dll,vmPerfmon.dll,所以修复之前可以手动先删除这两个文件看看= =在vmware安装目录下面,假如无法删除可以把后缀名改为.txt,这样就不会阻碍vmware的修复程序。

  8. 修复程序运行完成,打开vmware,提示你更新新版本,或者你自己选项里检查更新一下= =,换到新版本。当然你直接卸载下一个应该也是一样。

  9. 我升级到15.5.1,重启之后可以正常运行,并且之前的虚拟机信息没有丢失。

总结

应该是win 1909 和 vmware的15.0的版本冲突,看其他人说1903也有问题。总之要听信windows为数不多的劝告,换新版本吧= =

确定错误信息

输入 SSH root@remotenode

输出: 无法创建目录 Could not create directory: C:\123\456\789.ssh 无法添加信任主机列表 Failed to add.....

然而.ssh目录明明就在用户名文件夹下存在= =

配置的免密登录远程主机也不能用

输入 scp ./test.txt root@remotenode:/root/test.win >输出: 无法找到文件 : No Such File

事实上这个文件存在

原因猜测: 用户名带中文或特殊字符, 导致路径无法识别

cmd和PowerShell 的编码都是GBK, 讲道理是可以用中文的...

使用chcp 65001换成utf-8也不行

当然也不可能重命名用户名文件夹..一大堆程序数据都在下面呢= =

可行方案 :

1. 使用git bash 代替[cmd/PowerShel] 之前装git有装git bash. 并且git bash 里可以设置中文字符集,因此就试了一下, 发现完全没有障碍= =

环境什么的完全没变, 可以正常找到.ssh目录 , 可以正常写入 known_host ,除了在第一次登的时候询问写入known_host, 之后免密登录也可以正常使用.

scp可以正常发送用户名目录下的文件, 不会找不到.

果然查遍全网也解决不了的问题是cmd自身的问题= =

2. 使用SSH工具,如Putty 使用Putty open登录主机, 好像不会提示known_host 的事情, 但是可以顺利免密登录.