ARTS第一周

1. Algorithm

1.1 题目

反转一个单链表,示例

输入: 1->2->3->4->5->null
输出: 5->4->3->2->1->null

1.2 思路

本题有两种方法,一是遍历法解决,通过对每个节点每一次遍历,把链表指针倒置;
二是通过递归法,压栈的时候实现正序,出栈的时候实现倒转。

1.3 遍历法实现

定义结点ListNode

public class ListNode {

  public int value;
  public ListNode next;

  public ListNode(int data) {
    this.value = data;
  }
}

定义两个节点变量,即每次遍历当前head节点后的得到反转后的新头结点pre,及当前head节点的后续节点next,最后返回新的反转后的pre

代码实现如下

public ListNode reverseList(ListNode head) {
  ListNode pre = null;
  ListNode next = null;
  while(head!=null) {
    next = head.next;  //第1步
    head.next = pre;  //第2步
    pre = head;  //第3步
    head = next;  //第4步
  }
  return pre;
}

第一次循环代码拆解分析

  • 初始化链表1->2->3->4->5->null,并将节点pre与节点next赋初值null
  • 在执行第1步代码前,链表节点如下图所示
    ARTS第一周_第1张图片
  • 第1步 next = head.next,即head = 1,next = 2,链表如下
    ARTS第一周_第2张图片
  • 第2步head.next = pre,即head.next = null,链表如下
    ARTS第一周_第3张图片
  • 第3步pre = head,即pre = 1,链表如下
    ARTS第一周_第4张图片
  • 第4步head = next,即head = 2,链表如下
    ARTS第一周_第5张图片
  • 第一次循环执行完毕,得到反转后新链表pre, 即1->null

第二次循环代码拆解分析

  • 第1步,next = head.next,即head = 2,next = 3,链表如下
    ARTS第一周_第6张图片
  • 第2步head.next = pre,即head.next = 1,链表如下
    ARTS第一周_第7张图片
  • 第3步pre = head,即pre = 2,链表如下
    ARTS第一周_第8张图片
  • 第4步head = next,即head = 3,链表如下
    ARTS第一周_第9张图片
  • 第二次循环执行完毕,得到反转后新链表pre, 即2->1->null

以此类推!第三次第四次第五次循环。最后反转成如下图


ARTS第一周_第10张图片

1.4 递归函数实现

public ListNode reverse(ListNode head) {
  if (head == null || head.next == null)
    return head;
  ListNode temp = head.next;
  ListNode newHead = reverse(temp);
  temp.next = head;
  head.next = null;
  return newHead;
}

递归过程代码分析如下

  • head = 5时,newHead = 5->null,链表如下
    ARTS第一周_第11张图片
  • head = 4时,newHead = 5->4->null,链表如下
    ARTS第一周_第12张图片
  • head = 3时,newHead = 5->4->3->null,链表如下
    ARTS第一周_第13张图片
  • head = 2时,newHead = 5->4->3->2->null,链表如下
    ARTS第一周_第14张图片
  • head = 1时,newHead = 5->4->3->2->1->null,链表如下
    ARTS第一周_第15张图片

1.5 总结

  • 遍历法实现,注意4条语句的顺序不能搞错,可以结合下图理解记忆。


    ARTS第一周_第16张图片
  • 递归法实现,注意每完成一次出栈反转,head = null,否则会出现死循环。

2. Review

2.1 英文技术文档

关于TLS协议中握手协议的探究:https://tools.ietf.org/html/rfc5246#page-33

2.2 握手协议交互流程

ARTS第一周_第17张图片

"握手阶段"涉及四次通信,我们一个个来看。需要注意的是,"握手阶段"的所有通信都是明文的。

2.2.1 客户端发出请求(ClientHello)

首先,客户端(通常是浏览器)先向服务器发出加密通信的请求,这被叫做ClientHello请求。
在这一步,客户端主要向服务器提供以下信息。

  • 支持的协议版本,比如TLS 1.0版。
  • 一个客户端生成的随机数,稍后用于生成"对话密钥"
  • 支持的加密方法,比如RSA公钥加密。
  • 支持的压缩方法

2.2.2 服务器回应(SeverHello)

服务器收到客户端请求后,向客户端发出回应,这叫做SeverHello。服务器的回应包含以下内容。

  • 确认使用的加密通信协议版本,比如TLS 1.0版本。如果浏览器与服务器支持的版本不一致,服务器关闭加密通信。
  • 一个服务器生成随机数,稍后用于生成"对话密钥"
  • 确认使用的加密方法,比如RSA公钥加密。
  • 服务器证书

2.2.3 客户端回应

客户端收到服务器回应以后,首先验证服务器证书。如果证书不是可信机构颁布、或者证书中的域名与实际域名不一致、或者证书已经过期,就会向访问者显示一个警告,由其选择是否还要继续通信。如果证书没有问题,客户端就会从证书中取出服务器的公钥。然后,向服务器发送下面三项信息。

  • 一个随机数该随机数用服务器公钥加密,防止被窃听。
  • 编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。
  • 客户端握手结束通知,表示客户端的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供服务器校验。

上面第一项的随机数,是整个握手阶段出现的第三个随机数,又称"pre-master key"。有了它以后,客户端和服务器就同时有了三个随机数,接着双方就用事先商定的加密方法,各自生成本次会话所用的同一把"会话密钥"

2.2.4 服务器的最后回应

服务器收到客户端的第三个随机数pre-master key之后,计算生成本次会话所用的"会话密钥"。然后,向客户端 最后发送下面信息。

  • 编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。
  • 服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供客户端校验。

至此,整个握手阶段全部结束。接下来,客户端与服务器进入加密通信,就完全是使用普通的HTTP协议,只不过用"会话密钥"加密内容。

2.2.5 总结:

  • HTTPS 结合使用了 非对称加密算法对称加密算法hash算法,分别利用他们的优势,避免他们的缺点。利用非对称加密算法获得对称加密算法的秘钥,保证他的安全性;然后实际的网页内容的加密使用的是对称加密算法,利用了对称加密算法速度快的优势,hash算法主要是校验内容防止篡改,最后数字证书,保证了服务器在将非对称加密算法的公钥传给浏览器时的安全性(防止身份冒充)。
  • HTTPS的四大金刚:
    非对称加密算法(会话密钥) +对称加密算法(加密内容) +数字证书(防止篡改非对称加密算法的公钥) + HASH算法(防止篡改消息)== HTTPS
  • HTTPS的本质是什么?
    HTTPS的本质就是在HTTP连接发起之前,先使用SSL/TLS协议,协调客户端和服务端,在两端各自生产一个对称加密算法的秘钥,然后使用普通的HTTP协议传输 经过对称加密算法加密的网页内容。因为对称加密算法的秘钥是安全的,所以对称加密算法加密的网页内容也是安全的。
  • 生成对话密钥一共需要三个随机数
  • 服务器公钥放在服务器的数字证书之中。

2.2.6 参考链接

  • SSL/TLS协议运行机制的概述,阮一峰, http://www.ruanyifeng.com/blog/2014/02/ssl_tls.html
  • The Transport Layer Security (TLS) Protocol, https://tools.ietf.org/html/rfc5246
  • 图解SSL/TLS协议, 阮一峰, http://www.ruanyifeng.com/blog/2014/09/illustration-ssl.html
  • 数字签名是什么,阮一峰,[http://www.ruanyifeng.com/blog/2011/08/what_is_a_digital_signature.html]
  • ssl协议中的dh算法的pre-master-secret, dog250, https://blog.csdn.net/dog250/article/details/5717162
  • What is a Digital Signature? David Youd, http://www.youdzone.com/signature.html
  • HTTPS(SSL/TLS) 原理之深入浅出, digdeep, https://www.cnblogs.com/digdeep/p/4832885.html

3. Tips

4. Share

你可能感兴趣的:(ARTS第一周)