Algorithms
234. Palindrome Linked List
Given a singly linked list, determine if it is a palindrome.
Example 1:
Input: 1->2
Output: false
Example 2:
Input: 1->2->2->1
Output: true
Solution 1——将链表分成两半,对后半段链表进行倒转,与前半段进行比较,时间复杂度O(n),空间复杂度O(1)
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isPalindrome(ListNode head) {
ListNode slow = head;
ListNode fast = head;
while(fast != null && fast.next != null){
fast = fast.next.next;
slow = slow.next;
}
if(fast != null){
slow = slow.next;
}
slow = reverse(slow);
fast = head;
while(slow != null){
if(slow.val != fast.val){
return false;
}
slow =slow.next;
fast = fast.next;
}
return true;
}
private ListNode reverse(ListNode node){
ListNode rev = null;
while(node != null){
ListNode next = node.next;
node.next = rev;
rev = node;
node = next;
}
return rev;
}
}
Review
We Hire the Best,Just like Everyone else
1、只雇佣最好的员工,员工的素质将决定公司的成功或者失败。
2、平庸的程序员无论无何都做不出伟大的程序员能做出的产品。
3、平庸的人只会雇佣水平不如他的人。
Tips
网络协议基础知识——虚拟机
1、虚拟机工作流程图
2、Tun 与tap的区别:
TUN是点对点的三层设备,工作在IP层,处理IP分组。
TAP是虚拟以太网设备,工作在第二层,处理以太网帧。
在Linux下,要实现内核空间和用户空间数据的交互,有多种方式:可以通过socket创建套接字,利用套接字实现数据交互;通过proc文件系统创建文件来进行数据交互;还可以通过设备文件的方式,访问设备文件会调用设备驱动相应的例程。设备驱动本身就是内核空间和用户空间的一个接口,Tun/tap驱动就是利用设备文件实现用户空间和内核空间的数据交互。
Tun/tap 驱动程序中包含两个部分,一部分是字符设备驱动,一部分是网卡驱动部分。网卡驱动部分接收来自TCP/IP协议栈的网络分包并发送或者反过来将接收到的网络分包传给协议栈处理,而字符驱动部分则将网络分包在用户空间和内核空间之间传送,模拟物理链路的数据接收和发送。
3、虚拟网卡连接到云中需要注意的四个问题:共享、互通、隔离和灵活。
共享和互通:在物理机上,需要有一个虚拟的交换机,brctl addbr br0
命令可以创建虚拟的网桥。创建出来后,可以将两个虚拟机的虚拟网卡都连接到虚拟网桥上brctl addif br0 tap0
,将两个虚拟机配置相同的子网网段,两台虚拟机就可以互相通信了。
隔离:vconfig,可以基于物理网卡etho创建带VLAN的虚拟网卡,所有从这个虚拟网卡出去的包,都带这个VLAN,如果这样,跨物理机的互通和隔离就可以通过这个网卡来实现。
4、桥接和nat的区别
桥接:相当于将物理机和虚拟机放在同一个网桥上,是一个网段的。虚拟机的IP由物理网络的DHCP服务器分配。
缺点:桥接因为是在二层网络上,所以虚拟机规模大的时候广播会很严重。
nat:虚拟机的网络是虚拟机的,物理机的网络是物理机的,两个不相同。虚拟机想要访问物理机的时候,需要将地址NAT成为物理机的地址。除此之外,它还会在你的笔记本电脑里内置一个DHCP服务器,为笔记本电脑上的虚拟机动态分配IP地址。
Share
设计模式第三篇 设计模式之代理模式