<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>O磊的博客</title>
  
  <subtitle>代码日记</subtitle>
  <link href="/atom.xml" rel="self"/>
  
  <link href="https%EF%BC%9A//xiaolei19991030x.github.io/"/>
  <updated>2019-12-28T11:27:05.262Z</updated>
  <id>https：//xiaolei19991030x.github.io/</id>
  
  <author>
    <name>demons</name>
    
  </author>
  
  <generator uri="http://hexo.io/">Hexo</generator>
  
  <entry>
    <title>排序算法——合并排序与自底向上合并排序</title>
    <link href="https%EF%BC%9A//xiaolei19991030x.github.io/%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95/page-14/"/>
    <id>https：//xiaolei19991030x.github.io/排序算法/page-14/</id>
    <published>2019-09-28T08:08:39.000Z</published>
    <updated>2019-12-28T11:27:05.262Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="\assets\js\Meting.min.js"></script><p>在我们之前的算法设计课程中,我们学习了合并排序与自底向上合并排序算法,今天我们就来分析一下这个算法。</p><a id="more"></a><h3 id="合并算法"><a href="#合并算法" class="headerlink" title="合并算法"></a>合并算法</h3><p>无论是合并排序还是自底向上合并排序,他的实现都基于一个重要的算法:合并算法(merge算法)。Merge算法实现的功能是将两个数组合并成为一个数组,我们可以定义一个结果数组b,再分别定义两个索引p1、p2,分别指向两<br>个数组的头,将p1、p2指向的两个数进行比较,并将较小的那一个放入数组b</p><h3 id="Merge算法的伪码如下"><a href="#Merge算法的伪码如下" class="headerlink" title="Merge算法的伪码如下:"></a>Merge算法的伪码如下:</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">merge(p, q, r, a[]):</span><br><span class="line"></span><br><span class="line">s←p; t←q+<span class="number">1</span>; k←p</span><br><span class="line"><span class="keyword">while</span> s≤q <span class="keyword">and</span> t≤r</span><br><span class="line"><span class="keyword">if</span> a[s] ≤ a[t] then</span><br><span class="line">b[k] ← a[s]</span><br><span class="line">s ←s+<span class="number">1</span></span><br><span class="line">    <span class="keyword">else</span></span><br><span class="line">        b[k]←a[t]</span><br><span class="line">        t←t+<span class="number">1</span></span><br><span class="line">    end <span class="keyword">if</span></span><br><span class="line">        k←k+<span class="number">1</span></span><br><span class="line">end <span class="keyword">while</span></span><br><span class="line"><span class="keyword">if</span> s=q+<span class="number">1</span> then b[k...r]←a[t...r]</span><br><span class="line"><span class="keyword">else</span> b[k...r]←a[s...q]</span><br><span class="line">end <span class="keyword">if</span></span><br><span class="line">a[p...r]←b[p...r]</span><br></pre></td></tr></table></figure><h3 id="自底向上合并排序算法"><a href="#自底向上合并排序算法" class="headerlink" title="自底向上合并排序算法"></a>自底向上合并排序算法</h3><p>自底向上合并算法顾名思义,就是从最底部开始,将数组元素两两合并,再将合并后的数组两两合并,直到重新合并成一个完整的数组。对于数组a = {9,4,5,2,1,7,4,6}的合并过程可以用如下图来表示:<br><img src="//xiaolei19991030x.github.io/排序算法/page-14/1.png" alt="1"></p><h3 id="完整代码-java"><a href="#完整代码-java" class="headerlink" title="完整代码(java)"></a>完整代码(java)</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//自底向上合并排序</span></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">BottomUpSort</span> </span>&#123;</span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String args[])</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="keyword">int</span> a[] = &#123;<span class="number">9</span>,<span class="number">4</span>,<span class="number">5</span>,<span class="number">2</span>,<span class="number">1</span>,<span class="number">7</span>,<span class="number">4</span>,<span class="number">6</span>&#125;;</span><br><span class="line">        bottomUpSort(a);</span><br><span class="line">        <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i&lt;a.length;i++)</span><br><span class="line">            System.out.print(a[i] + <span class="string">" "</span>);</span><br><span class="line">        System.out.println();</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">bottomUpSort</span><span class="params">(<span class="keyword">int</span> a[])</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="keyword">int</span> i, s, t = <span class="number">1</span>;</span><br><span class="line">        <span class="keyword">while</span>(t &lt; a.length-<span class="number">1</span>)</span><br><span class="line">        &#123;</span><br><span class="line">            s = t;</span><br><span class="line">            t = <span class="number">2</span>*s;</span><br><span class="line">            i = <span class="number">0</span>;</span><br><span class="line">            <span class="keyword">for</span>(;i+t &lt; a.length;i+=t)</span><br><span class="line">                merge(i, i+s-<span class="number">1</span>, i+t-<span class="number">1</span>, a);    <span class="comment">//自底向上进行排序</span></span><br><span class="line">            <span class="keyword">if</span>(i+s-<span class="number">1</span> &lt; a.length-<span class="number">1</span>)    <span class="comment">//判断是否有落单元素</span></span><br><span class="line">                merge(i, i+s-<span class="number">1</span>, a.length-<span class="number">1</span>, a);</span><br><span class="line">            </span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">merge</span><span class="params">(<span class="keyword">int</span> low, <span class="keyword">int</span> mid, <span class="keyword">int</span> high, <span class="keyword">int</span> a[])</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="keyword">int</span> b[] = <span class="keyword">new</span> <span class="keyword">int</span>[a.length];    <span class="comment">//    建立转存数组</span></span><br><span class="line">        <span class="keyword">int</span> f = low, s = mid+<span class="number">1</span>, p = low;</span><br><span class="line">        <span class="comment">//f为第一个数组索引,s为第二个数组索引,p为b数组索引</span></span><br><span class="line">        <span class="keyword">while</span>(f&lt;=mid &amp;&amp; s&lt;=high)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="comment">//在两个数组元素中值小的一方放入b数组</span></span><br><span class="line">            <span class="keyword">if</span>(a[f] &lt;= a[s])</span><br><span class="line">            &#123;</span><br><span class="line">                b[p] = a[f];</span><br><span class="line">                f++;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">else</span></span><br><span class="line">            &#123;</span><br><span class="line">                b[p] = a[s];</span><br><span class="line">                s++;</span><br><span class="line">            &#125;</span><br><span class="line">            p++;</span><br><span class="line">        &#125;</span><br><span class="line">        </span><br><span class="line">        <span class="keyword">if</span>(f == mid+<span class="number">1</span>)    <span class="comment">//若第一个数组中的元素全部存储进去了,那么将第二个数组中的剩余元素全部放入b数组</span></span><br><span class="line">            <span class="keyword">for</span>(;s &lt;= high &amp;&amp; p&lt;=high;p++,s++)</span><br><span class="line">                b[p] = a[s];</span><br><span class="line">        <span class="keyword">else</span> <span class="comment">//否则将第一个数组中的元素全部放入b数组</span></span><br><span class="line">            <span class="keyword">for</span>(;f&lt;=mid &amp;&amp; p&lt;=high;p++,f++)    </span><br><span class="line">                b[p] = a[f];</span><br><span class="line">        </span><br><span class="line">        <span class="keyword">for</span>(<span class="keyword">int</span> i=low;i&lt;=high;i++)</span><br><span class="line">            a[i] = b[i];</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="合并排序算法"><a href="#合并排序算法" class="headerlink" title="合并排序算法"></a>合并排序算法</h3><p>合并排序算法与自底向上合并排序十分相似(废话!),只不过与自底向上合并排序不同的是,合并排序是一个自顶向下的过程。我们可以将一整个数组拆分成两个数组,将其中的一个数组再进行拆分,直到拆分成两个单个元素,再将他们合并…重复此过程直到整个数组都重新合并完毕。</p><p>对于数组a[]={9,4,5,2,1,7,4,6}的合并排序可以用如下图示表示:<br><img src="//xiaolei19991030x.github.io/排序算法/page-14/2.png" alt="2"></p><h3 id="合并排序算法伪代码如下"><a href="#合并排序算法伪代码如下" class="headerlink" title="合并排序算法伪代码如下:"></a>合并排序算法伪代码如下:</h3><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">mergesort(low, high, a[]):</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> low&lt;high then</span><br><span class="line">mid←(low + high)/<span class="number">2</span></span><br><span class="line">    ergesort(low, mid, a)</span><br><span class="line">    mergesort(mid+<span class="number">1</span>, high, a)</span><br><span class="line">    merge(low, mid, high, a)</span><br><span class="line">end <span class="keyword">if</span></span><br></pre></td></tr></table></figure><h3 id="完整代码-Java"><a href="#完整代码-Java" class="headerlink" title="完整代码(Java)"></a>完整代码(Java)</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//合并排序算法</span></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">MergeSort</span> </span>&#123;</span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String args[])</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="keyword">int</span> a[] = &#123;<span class="number">9</span>,<span class="number">4</span>,<span class="number">5</span>,<span class="number">2</span>,<span class="number">1</span>,<span class="number">7</span>,<span class="number">4</span>,<span class="number">6</span>&#125;;</span><br><span class="line">        mergeSort(<span class="number">0</span>, a.length-<span class="number">1</span>, a);</span><br><span class="line">        <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i&lt;a.length;i++)</span><br><span class="line">            System.out.print(a[i] + <span class="string">" "</span>);</span><br><span class="line">        System.out.println();</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    <span class="comment">//合并排序</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">mergeSort</span><span class="params">(<span class="keyword">int</span> low, <span class="keyword">int</span> high, <span class="keyword">int</span> a[])</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="keyword">if</span>(low &lt; high)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">int</span> mid = (low + high)/<span class="number">2</span>;</span><br><span class="line">            mergeSort(low, mid, a);</span><br><span class="line">            mergeSort(mid+<span class="number">1</span>, high, a);</span><br><span class="line">            merge(low, mid, high, a);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    <span class="comment">//合并两个数组</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">merge</span><span class="params">(<span class="keyword">int</span> low, <span class="keyword">int</span> mid, <span class="keyword">int</span> high, <span class="keyword">int</span> a[])</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="keyword">int</span> b[] = <span class="keyword">new</span> <span class="keyword">int</span>[a.length];    <span class="comment">//    建立转存数组</span></span><br><span class="line">        <span class="keyword">int</span> f = low, s = mid+<span class="number">1</span>, p = low;</span><br><span class="line">        <span class="comment">//f为第一个数组索引,s为第二个数组索引,p为b数组索引</span></span><br><span class="line">        <span class="keyword">while</span>(f&lt;=mid &amp;&amp; s&lt;=high)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="comment">//在两个数组元素中值小的一方放入b数组</span></span><br><span class="line">            <span class="keyword">if</span>(a[f] &lt;= a[s])</span><br><span class="line">            &#123;</span><br><span class="line">                b[p] = a[f];</span><br><span class="line">                f++;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">else</span></span><br><span class="line">            &#123;</span><br><span class="line">                b[p] = a[s];</span><br><span class="line">                s++;</span><br><span class="line">            &#125;</span><br><span class="line">            p++;</span><br><span class="line">        &#125;</span><br><span class="line">        </span><br><span class="line">        <span class="keyword">if</span>(f == mid+<span class="number">1</span>)    <span class="comment">//若第一个数组中的元素全部存储进去了,那么将第二个数组中的剩余元素全部放入b数组</span></span><br><span class="line">            <span class="keyword">for</span>(;s &lt;= high &amp;&amp; p&lt;=high;p++,s++)</span><br><span class="line">                b[p] = a[s];</span><br><span class="line">        <span class="keyword">else</span> <span class="comment">//否则将第一个数组中的元素全部放入b数组</span></span><br><span class="line">            <span class="keyword">for</span>(;f&lt;=mid &amp;&amp; p&lt;=high;p++,f++)    </span><br><span class="line">                b[p] = a[f];</span><br><span class="line">        </span><br><span class="line">        <span class="keyword">for</span>(<span class="keyword">int</span> i=low;i&lt;=high;i++)</span><br><span class="line">            a[i] = b[i];</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;在我们之前的算法设计课程中,我们学习了合并排序与自底向上合并排序算法,今天我们就来分析一下这个算法。&lt;/p&gt;
    
    </summary>
    
      <category term="排序算法" scheme="https%EF%BC%9A//xiaolei19991030x.github.io/categories/%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95/"/>
    
    
      <category term="排序算法" scheme="https%EF%BC%9A//xiaolei19991030x.github.io/tags/%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95/"/>
    
  </entry>
  
  <entry>
    <title>如何在VC++6.0上搭建OpenGL开发环境</title>
    <link href="https%EF%BC%9A//xiaolei19991030x.github.io/OpenGL/page-13/"/>
    <id>https：//xiaolei19991030x.github.io/OpenGL/page-13/</id>
    <published>2019-09-23T14:18:25.000Z</published>
    <updated>2019-09-23T17:32:52.744Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="\assets\js\Meting.min.js"></script><p>OPenGL(Open Graphics Library)是一个跨编程语言、跨平台的编程接口规格的专业的图形程序接口。是一个功能强大，调用方便的底层图形库。下面来介绍如何在VC++6.0上搭建OpenGL开发环境。</p><a id="more"></a><h3 id="工具"><a href="#工具" class="headerlink" title="工具"></a>工具</h3><ul><li><p><a href="https://pan.baidu.com/s/1glYPY8fqW4LZvA8EhHuvxg" target="_blank" rel="noopener">VC++6.0</a><br>提取码：qxzl<br>备注：我是安装在D盘上的，默认是安装在C盘上。</p><p><img src="//xiaolei19991030x.github.io/OpenGL/page-13/4.PNG" alt="4"></p></li><li><p><a href="https://www.opengl.org/resources/libraries/glut/glutdlls37beta.zip" target="_blank" rel="noopener">glutdlls37beta.zip</a></p></li></ul><h3 id="步骤"><a href="#步骤" class="headerlink" title="步骤"></a>步骤</h3><p>1.安装VC++6.0，一路安装即可。</p><p><img src="//xiaolei19991030x.github.io/OpenGL/page-13/2.PNG" alt="2"></p><p>2.glut文件下载，解压后出现以下5个文件，即<font color="blue"><strong>1个.h文件</strong></font>,<font color="blue"><strong>2个.dll文件</strong></font> 和 <font color="blue"><strong>2个.lib文件</strong></font>。</p><p><img src="//xiaolei19991030x.github.io/OpenGL/page-13/1.PNG" alt="1"></p><h4 id="h头文件"><a href="#h头文件" class="headerlink" title=".h头文件"></a>.h头文件</h4><p>将解压后的压缩包中的.h文件放到 VC++安装目录 vc 6.0\VC98\Include\GL 的文件夹中,如下图所示。</p><p><img src="//xiaolei19991030x.github.io/OpenGL/page-13/3.PNG" alt="1"></p><p>提示：如果在incluce目录下没有GL文件夹，则需要手动创建。</p><h4 id="dll头文件"><a href="#dll头文件" class="headerlink" title=".dll头文件"></a>.dll头文件</h4><p>将 <font color="blue"><strong>glut.dll</strong></font> ,<font color="blue"><strong>glut32.dll</strong></font> 这两个动态库文件放到操作系统目录下面的 <font color="red"><strong>C:\Windows\system32</strong></font>或<font color="red"><strong>C:\Windows\SysWOW64</strong></font> 下，<br>为了兼容性考虑，最好在这两个目录下都复制相应的文件。</p><p><img src="//xiaolei19991030x.github.io/OpenGL/page-13/5.PNG" alt="5"></p><p><img src="//xiaolei19991030x.github.io/OpenGL/page-13/6.PNG" alt="6"></p><h4 id="lib头文件"><a href="#lib头文件" class="headerlink" title=".lib头文件"></a>.lib头文件</h4><p>解压后将得到的 <font color="blue"><strong>glut.lib</strong></font> 和 <font color="blue"><strong>glut32.lib</strong></font> 这两个静态函数库复制到 vc 6.0\VC98\Lib 文件夹下。</p><p><img src="//xiaolei19991030x.github.io/OpenGL/page-13/7.PNG" alt="7"></p><p>3.程序测试</p><ul><li><p>首先，打开VC++6.0软件，点击菜单栏上的“File(文件)”–&gt;”new(新建)”，如下图所示：</p><p>  <img src="//xiaolei19991030x.github.io/OpenGL/page-13/9.PNG" alt="9"></p></li><li><p>弹出一个“new (新建)”窗口，点击“project（工程）”选项卡，然后选中“Win32 Console Application”,再填写一个工程名，如下图所示：</p><p>  <img src="//xiaolei19991030x.github.io/OpenGL/page-13/10.PNG" alt="10"></p></li><li><p>选择好后点击“确定”按钮，会弹出“Win32 Console Application”窗口，在窗口中选择什么类型的控制台程序，一般默认“an empty project（一个空过程）”即可，点击“finish（完成）”按钮，如下图所示：</p><p>   <img src="//xiaolei19991030x.github.io/OpenGL/page-13/11.PNG" alt="11"></p></li><li><p>这样就创建好了一个新工程，如下图所示：</p><p>  <img src="//xiaolei19991030x.github.io/OpenGL/page-13/12.PNG" alt="12"></p></li><li><p>选中Source Files文件夹，然后单击菜单栏上的“project（工程）”–&gt;”add file to project（增加到工程）”–&gt;”new（新建）”，如下图所示：</p><p>  <img src="//xiaolei19991030x.github.io/OpenGL/page-13/13.PNG" alt="13"></p></li><li><p>进入到“new(新建)”窗口，点击“Files（文件）”选项，在其中选择“C++ Source File”选项，在右侧填写“file name(文件名)”，然后点击“确定”按钮，如下图所示：</p><p>  <img src="//xiaolei19991030x.github.io/OpenGL/page-13/14.PNG" alt="14"></p></li><li><p>编写程序，编译运行<br>源代码如下：</p> <figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;gl/glut.h&gt; </span></span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">mydisplay</span><span class="params">(<span class="keyword">void</span>)</span> </span></span><br><span class="line"><span class="function"></span>&#123; </span><br><span class="line">  <span class="comment">//清除色彩位缓冲区</span></span><br><span class="line">    glClear(GL_COLOR_BUFFER_BIT);</span><br><span class="line">    glRectf(<span class="number">-0.5f</span>, <span class="number">-0.5f</span>, <span class="number">0.5f</span>, <span class="number">0.5f</span>); </span><br><span class="line">    <span class="comment">//按上述命令绘制图形，glFlush命令只适用于单缓冲模式</span></span><br><span class="line">    glFlush(); </span><br><span class="line">&#125; </span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">(<span class="keyword">int</span> argc,<span class="keyword">char</span>**argv)</span> </span></span><br><span class="line"><span class="function"></span>&#123; </span><br><span class="line">  <span class="comment">//初始化opengl工具箱函数库</span></span><br><span class="line">    glutInit(&amp;argc,argv); </span><br><span class="line">    <span class="comment">//设置RGB色彩模式与单缓冲绘图模式</span></span><br><span class="line">    glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE); </span><br><span class="line">    <span class="comment">//设置图像显示窗口的左上角位置(20,200)</span></span><br><span class="line">    glutInitWindowPosition(<span class="number">200</span>,<span class="number">200</span>); </span><br><span class="line">    <span class="comment">//设置窗口大小(400,400)</span></span><br><span class="line">    glutInitWindowSize(<span class="number">400</span>,<span class="number">400</span>); </span><br><span class="line">    <span class="comment">//设置窗口标题</span></span><br><span class="line">    glutCreateWindow(<span class="string">"hello world"</span>); </span><br><span class="line">    <span class="comment">//myDisplay，表示取得函数名所对应的地址（函数地址）</span></span><br><span class="line">    glutDisplayFunc(mydisplay); </span><br><span class="line">    <span class="comment">//程序主循环</span></span><br><span class="line">    glutMainLoop(); </span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>; </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>  <img src="//xiaolei19991030x.github.io/OpenGL/page-13/8.PNG" alt="8"></p></li><li><p>运行结果如下：</p><p> <img src="//xiaolei19991030x.github.io/OpenGL/page-13/15.PNG" alt="15"> </p><h3 id="感受"><a href="#感受" class="headerlink" title="感受"></a>感受</h3><p>花了一下午的时间才把OpenGL弄好，期间遇到了各种各样的问题解决在最终都解决了，过程中也收获了许多,也在CSDN上搜了许多教程，顺便写了这篇文章，以后会继续坚持写博客的。</p></li></ul>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;OPenGL(Open Graphics Library)是一个跨编程语言、跨平台的编程接口规格的专业的图形程序接口。是一个功能强大，调用方便的底层图形库。下面来介绍如何在VC++6.0上搭建OpenGL开发环境。&lt;/p&gt;
    
    </summary>
    
      <category term="OpenGL" scheme="https%EF%BC%9A//xiaolei19991030x.github.io/categories/OpenGL/"/>
    
    
      <category term="OpenGL" scheme="https%EF%BC%9A//xiaolei19991030x.github.io/tags/OpenGL/"/>
    
  </entry>
  
  <entry>
    <title>Java Web学习——用Intellij Idea 创建Web项目</title>
    <link href="https%EF%BC%9A//xiaolei19991030x.github.io/Java-Web/page-12/"/>
    <id>https：//xiaolei19991030x.github.io/Java-Web/page-12/</id>
    <published>2019-09-04T15:37:06.000Z</published>
    <updated>2019-09-23T13:52:08.741Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="\assets\js\Meting.min.js"></script><p>相关软件：</p><ul><li>Intellij Idea  破解教程：<a href="https://jinphy.github.io/2018/08/22/idea-tutorial/" target="_blank" rel="noopener">戳这!!!</a></li><li>JDK 1.6/1.7/1.8都可以</li><li>tomcat 7以上都可以,去官网下载压缩包解压即可 链接：<a href="http://tomcat.apache.org/" target="_blank" rel="noopener">http://tomcat.apache.org/</a><a id="more"></a></li></ul><h3 id="一、创建简单web项目2019-9-23-21-51-45"><a href="#一、创建简单web项目2019-9-23-21-51-45" class="headerlink" title="一、创建简单web项目2019/9/23 21:51:45"></a>一、创建简单web项目2019/9/23 21:51:45</h3><ul><li><p>File -&gt; New Project -&gt; 选择你的Project SDK（我的是1.8）-&gt; Next </p><p><img src="//xiaolei19991030x.github.io/Java-Web/page-12/1.png" alt="1"></p><p><img src="//xiaolei19991030x.github.io/Java-Web/page-12/2.png" alt="2"></p></li><li><p>输入项目名：webDemo -&gt; Next -&gt; Finish</p><p><img src="//xiaolei19991030x.github.io/Java-Web/page-12/3.png" alt="3"></p></li></ul><h3 id="二、创建一个Module"><a href="#二、创建一个Module" class="headerlink" title="二、创建一个Module"></a>二、创建一个Module</h3><ul><li>鼠标点中项目名称webDemo -&gt; 右键选择New，选择 Module -&gt; Module SDK 选择1. -&gt; 勾选JavaEE下的Web Application(4.0)，注意窗口下的version对应为4.0，且Create web.xml已勾选 -&gt; Next</li></ul><p><img src="//xiaolei19991030x.github.io/Java-Web/page-12/4.png" alt="4"></p><p><img src="//xiaolei19991030x.github.io/Java-Web/page-12/5.png" alt="5"></p><ul><li>输入Module name 为firstweb -&gt; Finish</li></ul><p><img src="//xiaolei19991030x.github.io/Java-Web/page-12/6.png" alt="6"></p><ul><li>创建好的web项目</li></ul><p><img src="//xiaolei19991030x.github.io/Java-Web/page-12/7.png" alt="7"></p><ul><li>在web/WEB_INF 目录下创建两个文件夹：classes和lib,classes用来存放编译后输出的class文件，lib用于存放第三方jar包</li></ul><p><img src="//xiaolei19991030x.github.io/Java-Web/page-12/8.png" alt="8"></p><ul><li>配置文件夹路径</li></ul><p>File -&gt; Project Structure (ctrl + shift + Alt + s) 或者使用工具栏的快捷键 -&gt; 选择Modules</p><p><img src="//xiaolei19991030x.github.io/Java-Web/page-12/9.png" alt="9"></p><ul><li>选择Paths -&gt; 选择“Use module compile out path” -&gt; 将Outputpath 和Test output path 都设置为刚刚创建的classes文件夹的路径。</li></ul><p><img src="//xiaolei19991030x.github.io/Java-Web/page-12/10.png" alt="10"></p><ul><li>选择当前窗口的Dependencies -&gt; 将Module SDK选择为1.8 -&gt; 点击下边的 + 号 -&gt; 选择 “1 JARS or directories …”</li></ul><p><img src="//xiaolei19991030x.github.io/Java-Web/page-12/11.png" alt="11"></p><ul><li>选择刚刚创建的lib文件夹 -&gt; OK</li></ul><p><img src="//xiaolei19991030x.github.io/Java-Web/page-12/12.png" alt="12"></p><ul><li>选择Jar Directory -&gt; OK</li></ul><p><img src="//xiaolei19991030x.github.io/Java-Web/page-12/13.png" alt="13"></p><ul><li>Apply -&gt; OK</li></ul><h3 id="三、配置Tomcat容器"><a href="#三、配置Tomcat容器" class="headerlink" title="三、配置Tomcat容器"></a>三、配置Tomcat容器</h3><ul><li>打开菜单Run -&gt; Edit Configurations…</li></ul><p><img src="//xiaolei19991030x.github.io/Java-Web/page-12/14.png" alt="14"></p><ul><li>点击 “+” ，选择 “Tomcat Server” -&gt; 选择“Local”</li></ul><p><img src="//xiaolei19991030x.github.io/Java-Web/page-12/15.png" alt="15"></p><ul><li>在”Name”处输入新的服务名，点击”Application server”后面的”Configure…”，弹出Tomcat Server窗口，选择本地安装的Tomcat目录 -&gt; OK </li></ul><p><img src="//xiaolei19991030x.github.io/Java-Web/page-12/16.png" alt="16"></p><h3 id="四、在tomcat上部署并运行项目"><a href="#四、在tomcat上部署并运行项目" class="headerlink" title="四、在tomcat上部署并运行项目"></a>四、在tomcat上部署并运行项目</h3><ul><li>选择Deployment -&gt; 点击下面的“+”号 -&gt; 选择Artifact</li></ul><p><img src="//xiaolei19991030x.github.io/Java-Web/page-12/17.png" alt="17"></p><ul><li>选择web项目 -&gt; Application context可以填“/firstweb”(访问项目用，也可以不填) -&gt; OK </li></ul><p><img src="//xiaolei19991030x.github.io/Java-Web/page-12/18.png" alt="18"></p><ul><li>回到Server面板,勾选取消“After Launch”，设置“HTTP port”和“JMX port”（默认值即可），将On ‘update’ action和On frame deactivation（这两个选项是tomcat配置了项目后才有的）改为update classes and resources -&gt; Apply</li></ul><p><img src="//xiaolei19991030x.github.io/Java-Web/page-12/19.png" alt="19"></p><h3 id="五、开发web项目并运行tomcat查看效果"><a href="#五、开发web项目并运行tomcat查看效果" class="headerlink" title="五、开发web项目并运行tomcat查看效果"></a>五、开发web项目并运行tomcat查看效果</h3><p>1、编辑index.jsp页面</p><p><img src="//xiaolei19991030x.github.io/Java-Web/page-12/20.png" alt="20"></p><p>2、运行Tomcat</p><p><img src="//xiaolei19991030x.github.io/Java-Web/page-12/21.png" alt="21"></p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;相关软件：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Intellij Idea  破解教程：&lt;a href=&quot;https://jinphy.github.io/2018/08/22/idea-tutorial/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;戳这!!!&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;JDK 1.6/1.7/1.8都可以&lt;/li&gt;
&lt;li&gt;tomcat 7以上都可以,去官网下载压缩包解压即可 链接：&lt;a href=&quot;http://tomcat.apache.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;http://tomcat.apache.org/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
    
    </summary>
    
      <category term="Java Web" scheme="https%EF%BC%9A//xiaolei19991030x.github.io/categories/Java-Web/"/>
    
    
      <category term="Java Web" scheme="https%EF%BC%9A//xiaolei19991030x.github.io/tags/Java-Web/"/>
    
      <category term="tomcat" scheme="https%EF%BC%9A//xiaolei19991030x.github.io/tags/tomcat/"/>
    
  </entry>
  
  <entry>
    <title>大话数据结构（三）— 栈的两种java实现方式</title>
    <link href="https%EF%BC%9A//xiaolei19991030x.github.io/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/page-11/"/>
    <id>https：//xiaolei19991030x.github.io/数据结构/page-11/</id>
    <published>2019-09-04T15:32:55.000Z</published>
    <updated>2019-09-04T15:35:55.670Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="\assets\js\Meting.min.js"></script><p><strong>栈</strong>：限定仅在表尾进行插入和删除操作的线性表。栈是一种<font color="red"><strong>后进先出</strong></font>的结构,我们将允许插入和删除的一端称为栈顶（top），而另一端就称之为栈底（bottom），当栈中无任何数据元素时称作空栈。</p><a id="more"></a><p>栈是一个线性表，它具有线性关系，即<strong>前驱后继</strong>的关系。由于栈限定了线性表插入和删除的位置，所以栈底也是固定的。在线性表中表头是栈底，表我是栈顶。最先入栈的只能在栈底。下面我们来看看栈的两种操作——进栈和出栈：</p><p><img src="//xiaolei19991030x.github.io/数据结构/page-11/2.png" alt="1"><br><img src="//xiaolei19991030x.github.io/数据结构/page-11/1.png" alt="2"></p><h3 id="1-栈的顺序存储结构"><a href="#1-栈的顺序存储结构" class="headerlink" title="1.栈的顺序存储结构"></a>1.栈的顺序存储结构</h3><p>用数组存放数据，top变量来指示栈顶元素在数组中的位置（栈顶指针）。一个长度为5的栈的示意图如下：<br><img src="//xiaolei19991030x.github.io/数据结构/page-11/3.png" alt="3"></p><p>实验程序：</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.tongcaipay.merchant.apply.study;</span><br><span class="line"><span class="keyword">import</span> java.util.Arrays;</span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * * 顺序栈</span></span><br><span class="line"><span class="comment"> * Created by xiaolei on 19-08-27</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">ArrayStack</span>&lt;<span class="title">T</span>&gt; </span>&#123;</span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">final</span> <span class="keyword">int</span> DEFAULT_SIZE = <span class="number">10</span>;   <span class="comment">//设置默认尺寸</span></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">int</span> capacity;  <span class="comment">//保存当前数组长度</span></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">int</span> addCapacity; <span class="comment">//设置当超出原数组长度时增加的长度</span></span><br><span class="line">    <span class="keyword">private</span> Object[] elements; <span class="comment">//初始化顺序栈数组</span></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">int</span> size; <span class="comment">//保存顺序栈中元素的个数</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="comment">//创建默认长度的空顺序栈</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="title">ArrayStack</span><span class="params">()</span></span>&#123;</span><br><span class="line">        capacity = DEFAULT_SIZE;</span><br><span class="line">        elements = <span class="keyword">new</span> Object[capacity];</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">//创建指定长度的空顺序栈</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="title">ArrayStack</span><span class="params">(<span class="keyword">int</span> capacity)</span></span>&#123;</span><br><span class="line">        <span class="keyword">this</span>.capacity = capacity;</span><br><span class="line">        elements = <span class="keyword">new</span> Object[capacity];</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 创建指定长度的空顺序栈，并指定超出数组范围后的增量</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> capacity 设置指定长度</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> addCapacity 设置增量</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="title">ArrayStack</span><span class="params">(<span class="keyword">int</span> capacity,<span class="keyword">int</span> addCapacity)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">this</span>.capacity = capacity;</span><br><span class="line">        <span class="keyword">this</span>.addCapacity = addCapacity;</span><br><span class="line">        elements = <span class="keyword">new</span> Object[capacity];</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">//获取顺序栈的长度</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">int</span> <span class="title">getSize</span><span class="params">()</span></span>&#123;</span><br><span class="line">        <span class="keyword">return</span> size;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">//判断顺序栈是否为空栈</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">isEmpty</span><span class="params">()</span></span>&#123;</span><br><span class="line">        <span class="keyword">return</span> size == <span class="number">0</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">//确保数组长度，如果超出就进行拓展</span></span><br><span class="line">    <span class="function"><span class="keyword">private</span> <span class="keyword">void</span> <span class="title">ensureCapacity</span><span class="params">(<span class="keyword">int</span> inputCapacity)</span></span>&#123;</span><br><span class="line">        <span class="comment">//如果输入的数组长度大于原有数组的长度</span></span><br><span class="line">        <span class="keyword">if</span> (inputCapacity &gt; capacity)&#123;</span><br><span class="line">            <span class="comment">//若果有设定数组增量</span></span><br><span class="line">            <span class="keyword">if</span>(addCapacity &gt; <span class="number">0</span>)&#123;</span><br><span class="line">                <span class="keyword">while</span> (inputCapacity &gt; addCapacity)</span><br><span class="line">                    capacity += inputCapacity;</span><br><span class="line">            &#125; <span class="keyword">else</span>&#123;</span><br><span class="line">                <span class="keyword">while</span> (inputCapacity &gt; addCapacity)</span><br><span class="line">                    capacity &lt;&lt;= <span class="number">1</span>;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="comment">//扩容后，将原数组复制到新数组中</span></span><br><span class="line">            elements = Arrays.copyOf(elements, capacity);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">//进栈</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">push</span><span class="params">(T element)</span></span>&#123;</span><br><span class="line">        <span class="comment">//确保数组长度</span></span><br><span class="line">        ensureCapacity(size+<span class="number">1</span>);</span><br><span class="line">        <span class="comment">//元素进栈</span></span><br><span class="line">        elements[size++] = element;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">//出栈</span></span><br><span class="line">    <span class="comment">//同时返回弹出的元素</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> T <span class="title">pop</span><span class="params">()</span></span>&#123;</span><br><span class="line">        <span class="comment">//如果是空栈</span></span><br><span class="line">        <span class="keyword">if</span> (isEmpty())</span><br><span class="line">            <span class="keyword">return</span> <span class="keyword">null</span>;</span><br><span class="line">        T element = (T) elements[size-<span class="number">1</span>];</span><br><span class="line">        <span class="comment">//释放栈顶元素并将长度减一</span></span><br><span class="line">        elements[--size] = <span class="keyword">null</span>;</span><br><span class="line">        <span class="keyword">return</span> element;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">//获取栈顶元素</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> T <span class="title">getTop</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> (T) elements[size - <span class="number">1</span>];</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">//清空顺序栈</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">clear</span><span class="params">()</span></span>&#123;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>;i&lt;size;i++)</span><br><span class="line">            elements[i] = <span class="keyword">null</span>;</span><br><span class="line">        size = <span class="number">0</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> String <span class="title">toString</span><span class="params">()</span></span>&#123;</span><br><span class="line">        <span class="keyword">if</span>(isEmpty())</span><br><span class="line">            <span class="keyword">return</span> <span class="string">"[]"</span>;</span><br><span class="line">        <span class="keyword">else</span> &#123;</span><br><span class="line">            <span class="comment">//实例化对sb,构造方法</span></span><br><span class="line"></span><br><span class="line">            StringBuilder sb = <span class="keyword">new</span> StringBuilder(<span class="string">"["</span>);  <span class="comment">//StringBuilder 的内容是可变的</span></span><br><span class="line">            <span class="keyword">for</span> (<span class="keyword">int</span> i = size -<span class="number">1</span>;i&gt;=<span class="number">0</span>;i--)</span><br><span class="line">                sb.append(elements[i].toString()+<span class="string">" "</span>);  <span class="comment">//链式编程.append特点:能放很多类型的数据</span></span><br><span class="line">            sb.append(<span class="string">"]"</span>);</span><br><span class="line">            <span class="keyword">int</span> len = sb.length();</span><br><span class="line">            <span class="keyword">return</span> sb.delete(len - <span class="number">2</span>,len - <span class="number">1</span>).toString();</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br></pre></td></tr></table></figure><p>测试代码:</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> </span>&#123;</span><br><span class="line">        ArrayStack&lt;String&gt; ll = <span class="keyword">new</span> ArrayStack&lt;String&gt;();</span><br><span class="line">        System.out.println(<span class="string">"原栈中的元素： "</span>+ll);</span><br><span class="line">        System.out.println(<span class="string">"----------进栈----------"</span>);</span><br><span class="line">        <span class="comment">//压栈</span></span><br><span class="line">        ll.push(<span class="string">"haha"</span>);</span><br><span class="line">        ll.push(<span class="string">"hehe"</span>);</span><br><span class="line">        ll.push(<span class="string">"xixi"</span>);</span><br><span class="line">        ll.push(<span class="string">"hiahia"</span>);</span><br><span class="line">        ll.push(<span class="string">"heihei"</span>);</span><br><span class="line">        System.out.println(<span class="string">"压栈后栈中所含元素： "</span>+ll);</span><br><span class="line">        <span class="comment">//获取栈顶元素</span></span><br><span class="line">        System.out.println(<span class="string">"栈顶元素为： "</span>+ll.getTop());</span><br><span class="line">        <span class="comment">//获取栈中元素个数</span></span><br><span class="line">        System.out.println(<span class="string">"当前栈中元素个数为： "</span>+ll.getSize());</span><br><span class="line">        <span class="comment">//出栈</span></span><br><span class="line">        System.out.println(<span class="string">"----------出栈----------"</span>);</span><br><span class="line">        ll.pop();</span><br><span class="line">        System.out.println(<span class="string">"出栈后栈中所含元素： "</span>+ll);</span><br><span class="line">        <span class="comment">//获取栈顶元素</span></span><br><span class="line">        System.out.println(<span class="string">"栈顶元素为： "</span>+ll.getTop());</span><br><span class="line">        <span class="comment">//获取栈中元素个数</span></span><br><span class="line">        System.out.println(<span class="string">"当前栈中元素个数为： "</span>+ll.getSize());</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>测试结果：<br><img src="//xiaolei19991030x.github.io/数据结构/page-11/5.png" alt="5"></p><h3 id="2-栈的链式存储结构"><a href="#2-栈的链式存储结构" class="headerlink" title="2.栈的链式存储结构"></a>2.栈的链式存储结构</h3><p>下面我们再来看看链栈，<br>链栈的入栈操作如图：<br><img src="//xiaolei19991030x.github.io/数据结构/page-11/6.png" alt="6"></p><p>链栈的出栈如下图：<br><img src="//xiaolei19991030x.github.io/数据结构/page-11/7.png" alt="7"></p><p>实验程序：</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.tongcaipay.merchant.apply.study;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">LinkListStack</span>&lt;<span class="title">T</span>&gt; </span>&#123;</span><br><span class="line"></span><br><span class="line">    <span class="comment">//定义一个内部类 Node 表示单链表的结点</span></span><br><span class="line">    <span class="keyword">private</span> <span class="class"><span class="keyword">class</span> <span class="title">Node</span> </span>&#123;</span><br><span class="line">        <span class="keyword">private</span> T element;</span><br><span class="line">        <span class="keyword">private</span> Node next;</span><br><span class="line"></span><br><span class="line">        <span class="comment">//初始化空构造器</span></span><br><span class="line">        </span><br><span class="line">        <span class="function"><span class="keyword">public</span> <span class="title">Node</span><span class="params">()</span> </span>&#123;</span><br><span class="line"></span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="comment">//初始化含参数构造器</span></span><br><span class="line">        <span class="function"><span class="keyword">public</span> <span class="title">Node</span><span class="params">(T element, Node next)</span> </span>&#123;</span><br><span class="line">            <span class="keyword">this</span>.element = element;</span><br><span class="line">            <span class="keyword">this</span>.next = next;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">private</span> Node top;<span class="comment">//存放栈顶结点</span></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">int</span> size;<span class="comment">//存放栈中结点数</span></span><br><span class="line"></span><br><span class="line">    <span class="comment">//初始化空栈</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="title">LinkListStack</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">//获取栈长度</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">int</span> <span class="title">getSize</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> size;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">//判断栈是否为空栈</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">isEmpty</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> size == <span class="number">0</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">push</span><span class="params">(T element)</span> </span>&#123;</span><br><span class="line">        <span class="comment">//进栈时,新结点的后驱指针next指向旧top</span></span><br><span class="line">        Node newNode = <span class="keyword">new</span> Node(element, top);</span><br><span class="line">        <span class="comment">//进来的新结点更新为top</span></span><br><span class="line">        top = newNode;</span><br><span class="line">        size++;</span><br><span class="line"></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="comment">//出栈</span></span><br><span class="line">    <span class="comment">//返回弹出的元素</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> T <span class="title">pop</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        <span class="comment">//如果弹出时栈为空则返回空</span></span><br><span class="line">        <span class="keyword">if</span> (isEmpty())</span><br><span class="line">            <span class="keyword">return</span> <span class="keyword">null</span>;</span><br><span class="line">        <span class="comment">//用一个结点保存原头结点</span></span><br><span class="line">        Node p = top;</span><br><span class="line">        <span class="comment">//将现在的头结点更新为原结点的下一个结点</span></span><br><span class="line">        top = top.next;</span><br><span class="line">        <span class="comment">//将原头结点释放</span></span><br><span class="line">        p.next = <span class="keyword">null</span>;</span><br><span class="line">        size--;</span><br><span class="line">        <span class="keyword">return</span> p.element;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">//获取栈顶元素</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> T <span class="title">getTop</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        <span class="comment">//如果为空栈则返回空</span></span><br><span class="line">        <span class="keyword">if</span> (isEmpty())</span><br><span class="line">            <span class="keyword">return</span> <span class="keyword">null</span>;</span><br><span class="line">        <span class="keyword">return</span> top.element;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">//清空栈</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">clear</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        top = <span class="keyword">null</span>;</span><br><span class="line">        size = <span class="number">0</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> String <span class="title">toString</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (isEmpty())</span><br><span class="line">            <span class="keyword">return</span> <span class="string">"[]"</span>;</span><br><span class="line">        <span class="keyword">else</span> &#123;</span><br><span class="line">            StringBuilder sb = <span class="keyword">new</span> StringBuilder(<span class="string">"["</span>);</span><br><span class="line">            <span class="keyword">for</span> (Node current = top; current != <span class="keyword">null</span>; current = current.next)</span><br><span class="line">                sb.append(current.element.toString() + <span class="string">"-&gt;"</span>);</span><br><span class="line">            sb.append(<span class="string">"]"</span>);</span><br><span class="line">            <span class="keyword">int</span> len = sb.length();</span><br><span class="line">            <span class="keyword">return</span> sb.delete(len - <span class="number">3</span>, len - <span class="number">1</span>).toString();</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br></pre></td></tr></table></figure><p>测试代码：</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> </span>&#123;</span><br><span class="line">        LinkListStack&lt;String&gt; ll = <span class="keyword">new</span> LinkListStack&lt;String&gt;();</span><br><span class="line">        System.out.println(<span class="string">"原栈中的元素： "</span> + ll);</span><br><span class="line">        System.out.println(<span class="string">"----------进栈啦----------"</span>);</span><br><span class="line">        <span class="comment">//压栈</span></span><br><span class="line">        ll.push(<span class="string">"haha"</span>);</span><br><span class="line">        ll.push(<span class="string">"hehe"</span>);</span><br><span class="line">        ll.push(<span class="string">"xixi"</span>);</span><br><span class="line">        ll.push(<span class="string">"hiahia"</span>);</span><br><span class="line">        ll.push(<span class="string">"heihei"</span>);</span><br><span class="line">        System.out.println(<span class="string">"压栈后栈中所含元素： "</span> + ll);</span><br><span class="line">        <span class="comment">//获取栈顶元素</span></span><br><span class="line">        System.out.println(<span class="string">"栈顶元素为： "</span> + ll.getTop());</span><br><span class="line">        <span class="comment">//获取栈中元素个数</span></span><br><span class="line">        System.out.println(<span class="string">"当前栈中元素个数为： "</span> + ll.getSize());</span><br><span class="line">        <span class="comment">//出栈</span></span><br><span class="line">        System.out.println(<span class="string">"----------出栈啦----------"</span>);</span><br><span class="line">        ll.pop();</span><br><span class="line">        System.out.println(<span class="string">"出栈后栈中所含元素： "</span> + ll);</span><br><span class="line">        <span class="comment">//获取栈顶元素</span></span><br><span class="line">        System.out.println(<span class="string">"栈顶元素为： "</span> + ll.getTop());</span><br><span class="line">        <span class="comment">//获取栈中元素个数</span></span><br><span class="line">        System.out.println(<span class="string">"当前栈中元素个数为： "</span> + ll.getSize());</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>测试结果：<br><img src="//xiaolei19991030x.github.io/数据结构/page-11/8.png" alt="8"></p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&lt;strong&gt;栈&lt;/strong&gt;：限定仅在表尾进行插入和删除操作的线性表。栈是一种&lt;font color=&quot;red&quot;&gt;&lt;strong&gt;后进先出&lt;/strong&gt;&lt;/font&gt;的结构,我们将允许插入和删除的一端称为栈顶（top），而另一端就称之为栈底（bottom），当栈中无任何数据元素时称作空栈。&lt;/p&gt;
    
    </summary>
    
      <category term="数据结构" scheme="https%EF%BC%9A//xiaolei19991030x.github.io/categories/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/"/>
    
    
      <category term="学习笔记" scheme="https%EF%BC%9A//xiaolei19991030x.github.io/tags/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
      <category term="顺序存储" scheme="https%EF%BC%9A//xiaolei19991030x.github.io/tags/%E9%A1%BA%E5%BA%8F%E5%AD%98%E5%82%A8/"/>
    
      <category term="链式存储" scheme="https%EF%BC%9A//xiaolei19991030x.github.io/tags/%E9%93%BE%E5%BC%8F%E5%AD%98%E5%82%A8/"/>
    
  </entry>
  
  <entry>
    <title>大话数据结构学习笔记（二）—— 线性表</title>
    <link href="https%EF%BC%9A//xiaolei19991030x.github.io/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/page-10/"/>
    <id>https：//xiaolei19991030x.github.io/数据结构/page-10/</id>
    <published>2019-09-04T15:28:48.000Z</published>
    <updated>2019-09-04T15:31:17.317Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="\assets\js\Meting.min.js"></script><p>对于没有指针的编程语言，可以用数组替代指针，来描述链表。让数组的每个元素由data和cur两部分组成，其中cur相当于链表的next指针，这种用数组描述的链表叫做静态链表，这种描述方法叫做游标实现法。我们对数组的第一个和最后一个元素做特殊处理，不存数据。让数组的第一个元素cur存放第一个备用元素（未被占用的元素）下标，而数组的最后一个元素cur存放第一个有值的元素下标，相当于头结点作用。空的静态链表如下图：</p><a id="more"></a><p><img src="https://images2017.cnblogs.com/blog/675248/201710/675248-20171030155818996-1272480786.png" alt></p><p>当存放入一些数据时（”甲””乙””丁””戊””己””庚”），静态链表为：</p><p><img src="//xiaolei19991030x.github.io/数据结构/page-10/3.png" alt="3"></p><h2 id="静态链表的插入操作"><a href="#静态链表的插入操作" class="headerlink" title="静态链表的插入操作"></a>静态链表的插入操作</h2><p>在静态链表第三个位置插入”丙”后，结果如下：</p><p><img src="//xiaolei19991030x.github.io/数据结构/page-10/2.png" alt="2"></p><h2 id="静态链表的删除操作"><a href="#静态链表的删除操作" class="headerlink" title="静态链表的删除操作"></a>静态链表的删除操作</h2><p>删除”甲”后，静态链表如下： </p><p><img src="//xiaolei19991030x.github.io/数据结构/page-10/1.png" alt="1"></p><h2 id="静态链表的优缺点"><a href="#静态链表的优缺点" class="headerlink" title="静态链表的优缺点"></a>静态链表的优缺点</h2><p><img src="https://images2018.cnblogs.com/blog/1407330/201806/1407330-20180604165334068-1432630198.png" alt></p><h2 id="静态链表的插入思路："><a href="#静态链表的插入思路：" class="headerlink" title="静态链表的插入思路："></a>静态链表的插入思路：</h2><p>（1）找到带插入索引前一个元素，获取到此时的cur值和下标tmp</p><p>（2）获取此时首元素存储的cur：备用链表的下标，也是此时待插入元素的下标  – newCur</p><p>（3）将前一个元素的cur指向此时待插入元素的下标  – newCur；</p><p>（4）将待插入元素的cur指向原来前一个元素的cur值，tmp</p><p>（5）将首元素存储的cur变成原来的值+1；</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 向指定位置插入数据</span></span><br><span class="line"><span class="comment"> * 1.先将带插入的这个放在备用链表的第一条，记做k，然后将首元素的游标指向备用链表的下一个的下标k+1</span></span><br><span class="line"><span class="comment"> * 2.不在第一条的情况：插入前index-1的位置list[index-1].cur = list[k]的下标</span></span><br><span class="line"><span class="comment"> * 3.list[k]的游标指向原来第三个位置处的坐标</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> index</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> element</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">addTo</span><span class="params">(<span class="keyword">int</span> index, Object element)</span> </span>&#123;</span><br><span class="line"><span class="keyword">if</span> (index &lt; -<span class="number">1</span> || index &gt; length || element == <span class="keyword">null</span>) &#123;</span><br><span class="line"><span class="keyword">return</span> <span class="keyword">false</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// 备用链表的第一个元素下标，也是待插入元素位置的下标newcur</span></span><br><span class="line"><span class="keyword">int</span> newCur = linklist[<span class="number">0</span>].cur;</span><br><span class="line"> </span><br><span class="line"><span class="comment">// 拿到前一个元素的下标</span></span><br><span class="line"><span class="keyword">int</span> ccur = linklist.length - <span class="number">1</span>;<span class="comment">// 获取第一个有效元素的下标</span></span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i &lt; index; i++) &#123;</span><br><span class="line">ccur = linklist[ccur].cur;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// 出来后ccur=2</span></span><br><span class="line"><span class="keyword">int</span> tmp = linklist[ccur].cur;<span class="comment">//存储原来前一个元素的cur == 3（此时为3）</span></span><br><span class="line">linklist[ccur].cur = newCur;<span class="comment">// 将原来之前有个元素的游标设置为新插入的元素位置的下标（newcur）</span></span><br><span class="line">linklist[newCur].cur = tmp;<span class="comment">// 将新插入的这个元素的下标设置为插入前，index元素前一个元素的游标ccur</span></span><br><span class="line">linklist[newCur] = <span class="keyword">new</span> Node(tmp, element);</span><br><span class="line">linklist[<span class="number">0</span>].cur = newCur + <span class="number">1</span>;</span><br><span class="line">length++;</span><br><span class="line"><span class="keyword">return</span> <span class="keyword">true</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="静态链表的删除思路："><a href="#静态链表的删除思路：" class="headerlink" title="静态链表的删除思路："></a>静态链表的删除思路：</h2><p>（1）找出删除位置的前一个元素的cur，也就是删除位置的下标tmp；</p><p>（2）根据tmp获取删除位置的cur，用来赋值给前一个元素的cur</p><p>（3）获取首元素的cur，也就是删除前备用链表的第一个位置的下标newfree；</p><p>（4）将删除元素的cur设置成newFree；将首元素的cur设置成删除元素的下标；代表这个删除位置已经到备用链表中的第一个位置，下次新增优先插到这个地方；</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 1.找出前一个元素的cur ，也就是删除位置元素的下标 --- 并将前一个元素的cur指向删除索引的后一个元素的下标</span></span><br><span class="line"><span class="comment"> * 2.删除的这个索引处元素进入备用链表的第一个，cur指向原来的备用链表第一个下标，首元素cur指向该索引处元素下标</span></span><br><span class="line"><span class="comment"> * </span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> index</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">delete</span><span class="params">(<span class="keyword">int</span> index)</span> </span>&#123;</span><br><span class="line"> </span><br><span class="line"><span class="comment">// 以index = 1为例</span></span><br><span class="line"><span class="keyword">if</span> (index &lt; -<span class="number">1</span> || index &gt; length) &#123;</span><br><span class="line"><span class="keyword">return</span> <span class="keyword">false</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">int</span> ccur = size - <span class="number">1</span>;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i &lt; index; i++) &#123;</span><br><span class="line">ccur = linklist[ccur].cur;</span><br><span class="line">&#125;</span><br><span class="line"> </span><br><span class="line"><span class="keyword">int</span> tmp = linklist[ccur].cur;<span class="comment">// 获取前一个元素的cur，也就是删除元素的下标</span></span><br><span class="line"><span class="keyword">int</span> newCur = linklist[tmp].cur;<span class="comment">// 获取删除元素的cur</span></span><br><span class="line">linklist[ccur].cur = newCur;</span><br><span class="line"> </span><br><span class="line"><span class="keyword">int</span> newFree = linklist[<span class="number">0</span>].cur;<span class="comment">// 获取原来链表的备用链表的第一个坐标</span></span><br><span class="line"> </span><br><span class="line">linklist[<span class="number">0</span>].cur = tmp;<span class="comment">// 将首元素的cur设置成删除位置处的下标</span></span><br><span class="line">linklist[tmp].cur = newFree;</span><br><span class="line">size--;</span><br><span class="line"><span class="keyword">return</span> <span class="keyword">true</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="循环链表"><a href="#循环链表" class="headerlink" title="循环链表"></a>循环链表</h2><p>将单链表终端结点的指针域由空指针改为指向头结点，形成一个环，这种头尾相接的单链表称为循环列表。</p><p>循环列表的结构如下图所示：<br><img src="//xiaolei19991030x.github.io/数据结构/page-10/4.png" alt="4"><br>循环链表的优点：可以从任意一个结点出发，遍历所有结点。</p><p>将两个具有尾指针的循环链表合并成一个表非常方便，如下图所示：<br><img src="//xiaolei19991030x.github.io/数据结构/page-10/5.png" alt="5"></p><p>合并之后：<br><img src="//xiaolei19991030x.github.io/数据结构/page-10/6.png" alt="6"></p><h2 id="双向链表"><a href="#双向链表" class="headerlink" title="双向链表"></a>双向链表</h2><p>在每个数据结点中都有两个指针，分别指向直接后继和直接前驱，这样的链表称为双向链表。</p><p>双向链表的结构如图所示：<br><img src="//xiaolei19991030x.github.io/数据结构/page-10/7.png" alt="7"></p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;对于没有指针的编程语言，可以用数组替代指针，来描述链表。让数组的每个元素由data和cur两部分组成，其中cur相当于链表的next指针，这种用数组描述的链表叫做静态链表，这种描述方法叫做游标实现法。我们对数组的第一个和最后一个元素做特殊处理，不存数据。让数组的第一个元素cur存放第一个备用元素（未被占用的元素）下标，而数组的最后一个元素cur存放第一个有值的元素下标，相当于头结点作用。空的静态链表如下图：&lt;/p&gt;
    
    </summary>
    
      <category term="数据结构" scheme="https%EF%BC%9A//xiaolei19991030x.github.io/categories/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/"/>
    
    
      <category term="学习笔记" scheme="https%EF%BC%9A//xiaolei19991030x.github.io/tags/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
      <category term="静态链表" scheme="https%EF%BC%9A//xiaolei19991030x.github.io/tags/%E9%9D%99%E6%80%81%E9%93%BE%E8%A1%A8/"/>
    
      <category term="数据结构" scheme="https%EF%BC%9A//xiaolei19991030x.github.io/tags/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/"/>
    
      <category term="线性表" scheme="https%EF%BC%9A//xiaolei19991030x.github.io/tags/%E7%BA%BF%E6%80%A7%E8%A1%A8/"/>
    
  </entry>
  
  <entry>
    <title>大话数据结构学习笔记（一）</title>
    <link href="https%EF%BC%9A//xiaolei19991030x.github.io/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/page-9/"/>
    <id>https：//xiaolei19991030x.github.io/数据结构/page-9/</id>
    <published>2019-09-04T15:17:54.000Z</published>
    <updated>2019-09-04T15:25:29.659Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="\assets\js\Meting.min.js"></script><blockquote><p>补充基础知识～</p><p>数据结构这门课程在以前学习过，但是由于当时学得比较一般就感觉并没有学到什么，于是在朋友的推荐下看《大话数据结构》，对于我这种小白来说是很友好的。整本书都感觉很通俗易懂，不像以前那样几乎看不懂。</p><p><img src="//xiaolei19991030x.github.io/数据结构/page-9/1.png" alt="1"></p></blockquote><a id="more"></a><h2 id="第一章-数据结构绪论"><a href="#第一章-数据结构绪论" class="headerlink" title="第一章 数据结构绪论"></a>第一章 数据结构绪论</h2><p>程序 = 数据结构 + 算法   </p><h4 id="1-1-数据（data"><a href="#1-1-数据（data" class="headerlink" title="1.1 数据（data)"></a>1.1 数据（data)</h4><p>是描述客观事物的符号，是计算机中可操作的对象，是能被计算机识别，并输入给计算机处理的符号集合。</p><h4 id="1-2-数据元素（data-element）"><a href="#1-2-数据元素（data-element）" class="headerlink" title="1.2 数据元素（data element）"></a>1.2 数据元素（data element）</h4><p>是组成数据的，有一定意义的基本单位，在计算机中通常作为整理处理，也被成为记录。</p><h4 id="1-3-数据项（data-item）"><a href="#1-3-数据项（data-item）" class="headerlink" title="1.3 数据项（data item）"></a>1.3 数据项（data item）</h4><p>数据项：一个数据可以由若干个数据项组成；<br>数据项是数据不可分割的最小单位</p><h4 id="1-4-数据对象-data-object"><a href="#1-4-数据对象-data-object" class="headerlink" title="1.4 数据对象(data object)"></a>1.4 数据对象(data object)</h4><p>数据对象：是性质相同的数据元素的集合，是数据的子集。</p><h4 id="1-5-数据结构"><a href="#1-5-数据结构" class="headerlink" title="1.5 数据结构"></a>1.5 数据结构</h4><p>数据结构：是相互之间存在一种或多种特定关系的数据元素集合</p><p>总结一下它们之间的关系：<br><img src="//xiaolei19991030x.github.io/数据结构/page-9/2.png" alt="2"></p><h4 id="1-6-逻辑结构与物理结构"><a href="#1-6-逻辑结构与物理结构" class="headerlink" title="1.6 逻辑结构与物理结构"></a>1.6 逻辑结构与物理结构</h4><h4 id="1-6-1-逻辑结构"><a href="#1-6-1-逻辑结构" class="headerlink" title="1.6.1 逻辑结构"></a>1.6.1 逻辑结构</h4><p> 1.集合结构</p><p>集合结构：集合结构中的数据元素除了同属于一个集合外，没有其他关系。</p><p><img src="//xiaolei19991030x.github.io/数据结构/page-9/3.png" alt="3"></p><p> 2.线性结构</p><p>线性结构：线性结构中的数据元素是一对一的关系.</p><p><img src="//xiaolei19991030x.github.io/数据结构/page-9/4.png" alt="4"></p><p>3.树形结构</p><p>树形结构：树形结构中的数据元素之间存在一种一对多的层次关系</p><p><img src="//xiaolei19991030x.github.io/数据结构/page-9/5.png" alt="5"></p><p>4.图形结构</p><p>图形结构: 图形结构的数据元素是多对多的关系</p><p><img src="//xiaolei19991030x.github.io/数据结构/page-9/6.png" alt="6"></p><h4 id="1-6-2-物理结构"><a href="#1-6-2-物理结构" class="headerlink" title="1.6.2 物理结构"></a>1.6.2 物理结构</h4><p>物理结构：是指数据的逻辑结构在计算机中的存储形式。</p><p>1.顺序存储结构</p><p>开辟一段连续的空间，依次按顺序存放数据元素</p><p><img src="//xiaolei19991030x.github.io/数据结构/page-9/7.png" alt="7"></p><p>2.链式存储结构</p><p>现在如银行、医院等地方，设置了排队系统，也就是每个人去了，先领一个号，等着叫号，叫到时去办理业务或看病。在等待的时候，你爱在哪在哪，可以坐着、站着或者走动，甚至出去逛一圈，只要及时回来就行。你关注的是前一个号有没有被叫到，叫到了，下一个就轮到了。</p><p><img src="//xiaolei19991030x.github.io/数据结构/page-9/8.png" alt="8"></p><h4 id="1-7抽象数据类型"><a href="#1-7抽象数据类型" class="headerlink" title="1.7抽象数据类型"></a>1.7抽象数据类型</h4><p>事实上，抽象数据类型体现了程序设计中问题分解、抽象和信息隐藏的特性。抽象数据类型把实际生活中的问题分解为多个规模小且容易处理的问题，然后建立一个计算机能处理的数据模型，并把每个功能模块的实现细节作为一个独立的单元，从而使具体实现过程隐藏起来。</p><h2 id="第一章总结"><a href="#第一章总结" class="headerlink" title="第一章总结"></a>第一章总结</h2><p><img src="//xiaolei19991030x.github.io/数据结构/page-9/9.png" alt="9"></p><p><img src="//xiaolei19991030x.github.io/数据结构/page-9/10.png" alt="10"></p><h2 id="第二章-算法"><a href="#第二章-算法" class="headerlink" title="第二章 算法"></a>第二章 算法</h2><p>算法：算法是解决特定问题求解步骤的描述，在计算机中表现为指令的有限序列，并且每条指令表示一个或多个操作。</p><p>为了解决某个或某类问题，需要把指令表示成一定的操作序列，操作序列包括一组操作，每一个操作都完成特定的功能，这就是算法了。</p><p>算法具有五个基本特性：输人、输出、有穷性、确定性和可行性。</p><h4 id="算法时间复杂度定义"><a href="#算法时间复杂度定义" class="headerlink" title="算法时间复杂度定义"></a>算法时间复杂度定义</h4><blockquote><p>在进行算法分析时，语句总的执行次数T（n）是关于问题规模n的函数，进而分析T（n）随n的变化情况并确定T（n）的数量级。算法的时间复杂度，也就是算法的时间量度，记作：T（n）=O(f(n))0它表示随问题规模n的增大，算法执行时间的增长率和f（n）的增长率相同，称作算法的渐近时间复杂度，简称为时间复杂度。其中f（n）是问题规模n的某个函数。</p></blockquote><h4 id="常见的时间复杂度"><a href="#常见的时间复杂度" class="headerlink" title="常见的时间复杂度"></a>常见的时间复杂度</h4><p><img src="//xiaolei19991030x.github.io/数据结构/page-9/11.png" alt="11"><br>记住logN &gt; 1；   2^n  &lt; n! &lt; n^n 就好理解了;</p><p>##第二章总结<br>算法的定义：算法是解决特定问题求解步骤的描述，在计算机中为指令的有限序列，并且每条指令表示一个或多个操作。</p><p>算法的特性：有穷性、确定性、可行性、输人、输出。</p><p>算法的设计的要求：正确性、可读性、健壮性、高效率和低存储量需求。</p><p>算法特性与算法设计容易混，需要对比记忆。</p><p>算法的度量方法：事后统计方法（不科学、不准确）、事前分析估算方法。在讲解如何用事前分析估算方法之前，我们先给出了函数渐近增长的定义。函数的渐近增长：给定两个函数f(n)和g(n)，如果存在一个整数N，使得对于所有的n&gt;N，f〔n〕总是比g〔n)大，那么，我们说f〔n)的增长渐近快于g〔n)。于是我们可以得出一个结论，判断一个算法好不好，我们只通过少量的数据是不能做出准确判断的，如果我们可以对比算法的关键执行次数函数的渐近增长性，基本就可以分析出：</p><p>某个算法，随着n的变大，它会越来越优于另一算法，或者越来越差于另一算法。</p><h2 id="第三章-线性表"><a href="#第三章-线性表" class="headerlink" title="第三章 线性表"></a>第三章 线性表</h2><h2 id="一、简介"><a href="#一、简介" class="headerlink" title="一、简介"></a>一、简介</h2><h3 id="1、线性表定义"><a href="#1、线性表定义" class="headerlink" title="1、线性表定义"></a>1、线性表定义</h3><p>线性表的定义：<font color="red">零个或多个数据元素的有限序列</font><br>这里有需要注意的几个关键地方： </p><p>1.首先他是一个序列，也就是说元素之间是有个先来后到的。</p><p>2.若元素存在多个，则<font color="red">第一个元素无前驱</font>，而<font color="red">最后一个元素无后继</font>最后一个元素无后继，其他元素都有且只有一个前驱和后继。</p><p>3.线性表强调是有限的，事实上无论计算机发展到多钱大，他所处理的元素都是有限的。</p><p>使用数学语言来表达的话：  <strong>a1,…,ai-1,ai,ai+1,…an</strong></p><p>表中ai-1领先于ai,ai领先于ai+1,称ai-1是ai的直接前驱元素,ai+1是ai的直接后继元素。所以线性表元素的各数n（n&gt;0）定义为线性表的长度，当n=0时，称为空表。</p><h3 id="2、抽象数据类型"><a href="#2、抽象数据类型" class="headerlink" title="2、抽象数据类型"></a>2、抽象数据类型</h3><p><img src="//xiaolei19991030x.github.io/数据结构/page-9/12.png" alt="12"></p><h2 id="二、线性表实现及优缺点"><a href="#二、线性表实现及优缺点" class="headerlink" title="二、线性表实现及优缺点"></a>二、线性表实现及优缺点</h2><p><img src="//xiaolei19991030x.github.io/数据结构/page-9/13.png" alt="13"></p><h3 id="1、线性表的顺序存储结构"><a href="#1、线性表的顺序存储结构" class="headerlink" title="1、线性表的顺序存储结构"></a>1、线性表的顺序存储结构</h3><p>线性表的顺序存储结构，指的是用一段地址<font color="red">连续的存储单元</font>一次存储线性表的数据元素。</p><p>线性表（a1,a2,……,an）的顺序存储如下：<br><img src="//xiaolei19991030x.github.io/数据结构/page-9/14.png" alt="14"></p><p>事实上物理上的存储方式事实上就是在内存中找个初始地址，然后通过占位的形式，把一定的内存空间给占了，然后把相同数据类型的数据元素依次放在这块空地中。</p><p>总结一下，顺序存储结构封装需要三个属性：</p><ul><li>存储空间的起始位置，数组data，它的存储位置就是线性表存储空间的存储位置；</li><li>线性表的最大存储容量：数组的长度:MaxSize；</li><li>线性表的当前长度:length；</li></ul><p>注意：<font color="red">数组的长度</font>与<font color="red">线性表的当前长度</font>需要区分一下。数组的长度是存放线性表的存储空间的总长度，一般初始化后不变。而线性表的当前长度是线性表中元素的个数，是会变化的。</p><p><font color="red">在任意时刻，length &lt;= MaxSize</font></p><p>在线性表的顺序存储结构中，它具有随机存储结构的特点，即直接通过下标获取数据或存储，那储它的时间复杂度为O(1)。而当该结构的数据类型做插入操作时，就不能只插入而不管后面的元素，所以插入操作，也要考虑清楚。</p><p><strong>插入算法的思路：</strong><br><img src="//xiaolei19991030x.github.io/数据结构/page-9/15.png" alt="15"></p><ul><li>如果插入位置不合理，抛出异常；</li><li>如果线性表长度大于等于数组长度，则抛出异常活动太增加数组容量；</li><li>最后一个元素开始向前遍历到第i个位置，分别将它们都向后移动一个位置；</li><li>将要插入元素填入位置i处；</li><li>表长加1；</li></ul><p>Java代码实现：</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/* 初始条件：顺序线性表L已存在，1 &lt;= i &lt;= length */</span></span><br><span class="line"><span class="comment">/* 操作结果：在L中第 index 个位置之前插入新的元素e,L的长度加1 */</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">add</span><span class="params">(<span class="keyword">int</span> i, T e)</span> </span></span><br><span class="line"><span class="function"><span class="title">if</span> <span class="params">(data.length == Maxsize)</span></span></span><br><span class="line"><span class="function">throw new <span class="title">RuntimeException</span><span class="params">(<span class="string">"数组越界"</span>)</span></span>;</span><br><span class="line">   <span class="keyword">if</span> (i &lt; <span class="number">1</span> || i &gt; data.length + <span class="number">1</span>)</span><br><span class="line">   <span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(<span class="string">"数组越界"</span>);</span><br><span class="line">   <span class="keyword">if</span> (i &lt;= data.length)&#123;</span><br><span class="line">   <span class="keyword">for</span>(<span class="keyword">int</span> i = data.length - <span class="number">1</span>; i&gt;= i - <span class="number">1</span>;k-s-)</span><br><span class="line">   data[k+<span class="number">1</span>] =data[k];</span><br><span class="line">&#125;</span><br><span class="line">data[i-<span class="number">1</span>] = e;</span><br><span class="line">data.length++;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><strong>删除算法的思路：</strong><br><img src="//xiaolei19991030x.github.io/数据结构/page-9/16.png" alt="16"></p><ul><li>如果删除位置不合理，抛出异常；</li><li>取出删除元素；</li><li>从删除元素位置开始遍历到最后一个元素，分别将它们都向前移动一个位置；</li><li>表长减1</li></ul><p>Java代码实现：</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/* 初始条件：顺序线性表L已存在，1 &lt;= i &lt;= length */</span></span><br><span class="line"><span class="comment">/* 操作结果：删除第i元素，并用e返回其值，L的长度减1 */</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">remove</span><span class="params">(<span class="keyword">int</span> i,T e)</span></span>&#123;</span><br><span class="line"><span class="keyword">int</span> k;</span><br><span class="line"><span class="keyword">if</span>(data.length == <span class="number">0</span>)</span><br><span class="line"><span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(<span class="string">"数组越界"</span>);</span><br><span class="line"><span class="keyword">if</span>(i &lt; <span class="number">1</span> || i &gt; data.length</span><br><span class="line"><span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(<span class="string">"数组越界"</span>);</span><br><span class="line">e = data[i - <span class="number">1</span>];</span><br><span class="line"><span class="keyword">if</span>(i &lt; data.length)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">for</span>(k = i;k &lt; data.length;k++)</span><br><span class="line">data[k-<span class="number">1</span>] = data[k];</span><br><span class="line">&#125;</span><br><span class="line">data.lenrth--;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><strong>插入和删除的时间复杂度</strong></p><p>最好情况：插入和删除操作刚好要求在最后一个位置操作，因为不需要移动任何元素，所以此时的时间复杂度为<strong>O(1)</strong>。</p><p>最坏情况：如果要插入和删除的位置是第一个元素，那就意味着要移动所有的元素向后或者向前，所以这个时间复杂度为<strong>O(n)</strong>。</p><p>平均情况，就取中间值<strong>O((n-1)/2)</strong>。</p><p>这样来看，平均情况复杂度简化后还是<font color="red"><strong>O(n)</strong>&lt;= MaxSize</font></p><p><strong>线性表顺序存储结构的优缺点：</strong></p><p><strong>优点</strong></p><ul><li>无需为表中元素之间的逻辑关系而增加额外的存储空间；</li><li>可以快速地存取表中任意位置的元素；</li></ul><p><strong>缺点</strong></p><ul><li>插入和删除操作需要移动大量元素；</li><li>当线性表长度变化较大时，难以确定存储空间的容量；</li><li>容易造成存储空间的“碎片”；</li></ul><h3 id="2、线性表的链式存储结构"><a href="#2、线性表的链式存储结构" class="headerlink" title="2、线性表的链式存储结构"></a>2、线性表的链式存储结构</h3><p><img src="//xiaolei19991030x.github.io/数据结构/page-9/17.png" alt="17"></p><p>对于线性表来说，总得有个头有个尾，链表也不例外。我们把链表中的第一个结点的存储位置叫做头指针，最后一个结点指针为空(NULL)。</p><p>在顺序存储结构中，有随机存储结构的特点，计算任意一个元素的存储位置是很容易的，但是在单链表中，想知道其中一个元素的位置，就得从第一个结点开始遍历，因此，对于单链表实现获取第i个元素的数据的操作，在算法上较为复杂。</p><p><strong>用java语言描述链式存储结构</strong></p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 　定义一个节点结点Node</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">private</span> <span class="class"><span class="keyword">class</span> <span class="title">Node</span>&lt;<span class="title">E</span>&gt; </span>&#123;</span><br><span class="line">E data;  <span class="comment">//数据域</span></span><br><span class="line">Node&lt;E&gt; next;  <span class="comment">//指针域</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="title">Node</span><span class="params">(E data, Node&lt;E&gt; next)</span> </span>&#123;</span><br><span class="line">   <span class="keyword">this</span>.data = data;</span><br><span class="line">   <span class="keyword">this</span>.next = next;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>算法思路：</p><ul><li>声明一个节点p指向链表第一个节点，初始化j从1开始；</li><li>当j&lt;i时， 遍历链表，让p的指针向后移动，不断指向下一个节点，j++；</li><li>若到链表末尾p为空，则说明第i个元素不存在；</li><li>否则查找成功，返回节点p的数据；</li></ul><p><strong>单链表数据的获取：</strong></p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">public</span> Node <span class="title">index</span><span class="params">(<span class="keyword">int</span> index)</span></span>&#123;</span><br><span class="line">     <span class="keyword">if</span>(index==<span class="number">0</span>)&#123;</span><br><span class="line">         <span class="comment">//头一个结点下标为0</span></span><br><span class="line">         current=head;</span><br><span class="line">         </span><br><span class="line">         <span class="keyword">return</span> current;</span><br><span class="line">         <span class="comment">//删除后链表为空</span></span><br><span class="line">     &#125;<span class="keyword">else</span>&#123;</span><br><span class="line">         current=head;</span><br><span class="line">         <span class="keyword">for</span>(<span class="keyword">int</span> i = <span class="number">0</span>;i &lt; index - <span class="number">1</span>;i++)&#123;</span><br><span class="line">             current=current.next;</span><br><span class="line">             <span class="comment">//因为current.next赋值给了current，所以要设置为index-1</span></span><br><span class="line">         &#125;</span><br><span class="line">         </span><br><span class="line">     &#125;</span><br><span class="line">     <span class="keyword">return</span> current;</span><br><span class="line"> &#125;</span><br></pre></td></tr></table></figure><p><strong>单链表的插入：</strong><br><img src="//xiaolei19991030x.github.io/数据结构/page-9/18.png" alt="18"><br>算法思路：</p><ul><li>声明一个指针p指向链表的第一个结点，初始化j从1开始</li><li>当j&lt;i时，就遍历链表，让p指针向后移动一位，不断地指向下一个结点，j++；</li><li>若到链表末尾p为空，则说明第i个结点不存在</li><li>否则查找成功，在系统中生成一个空节点s</li><li>将数据元素e赋值给s-&gt;data</li><li>单链表的插入标准语句，s-&gt;next = p-&gt;next,p-&gt;next=s;</li><li>返回成功</li></ul><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment">  * 获取第i个结点（包括第0个结点，头结点）</span></span><br><span class="line"><span class="comment">  * 获取结点值只需要GetNode(i).data即可，不再写方法了</span></span><br><span class="line"><span class="comment">  */</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> Node&lt;E&gt; <span class="title">GetNode</span><span class="params">(<span class="keyword">int</span> i)</span> </span>&#123;</span><br><span class="line"><span class="keyword">if</span> (i &lt; <span class="number">0</span> || i &gt; count) &#123;</span><br><span class="line"><span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(<span class="string">"元素位置错误！"</span>);</span><br><span class="line">    &#125; <span class="keyword">else</span> <span class="keyword">if</span> (i == <span class="number">0</span>) &#123;</span><br><span class="line">    <span class="keyword">return</span> head;    <span class="comment">//第0个节点为head</span></span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;   <span class="comment">//1 &lt;= i &lt;= count</span></span><br><span class="line">    Node&lt;E&gt; node = head.next;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> k = <span class="number">1</span>; k &lt; i; k++) &#123;</span><br><span class="line">    node = node.next;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> node;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment">  * 第i个位置插入新的元素</span></span><br><span class="line"><span class="comment">  */</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">ListInsert</span><span class="params">(<span class="keyword">int</span> i, E e)</span> </span>&#123;</span><br><span class="line"><span class="keyword">if</span> (i &lt; <span class="number">1</span> || i &gt; count + <span class="number">1</span>) &#123;</span><br><span class="line"><span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(<span class="string">"插入位置错误！"</span>);</span><br><span class="line">&#125; <span class="keyword">else</span> &#123;</span><br><span class="line">Node&lt;E&gt; newNode = <span class="keyword">new</span> Node&lt;E&gt;(e, <span class="keyword">null</span>);</span><br><span class="line">newNode.next = GetNode(i - <span class="number">1</span>).next;  <span class="comment">//因为GetNode()方法中包含了获取头结点，所以不需单独判断了</span></span><br><span class="line">GetNode(i - <span class="number">1</span>).next = newNode;</span><br><span class="line">count++;</span><br><span class="line">System.out.println(<span class="string">"插入成功！"</span>);</span><br><span class="line">   &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><strong>单链表的删除：</strong><br><img src="//xiaolei19991030x.github.io/数据结构/page-9/19.png" alt="19"><br>算法思路：</p><ul><li>一个指针p指向链表的第一个结点，初始化j从1开始</li><li>当j&lt;i时，就遍历链表，让p指针向后移动一位，不断地指向下一个结点，j++；</li><li>若到链表末尾p为空，则说明第i个结点不存在</li><li>否则，查找成功，将欲删除的结点p-&gt;next赋给q</li><li>单链表的删除标准语句p-&gt;next=q-&gt;next</li><li>将q结点中的数据赋给e，作为返回</li><li>释放q结点</li><li>返回成功</li></ul><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment">  * 获取第i个结点（包括第0个结点，头结点）</span></span><br><span class="line"><span class="comment">  * 获取结点值只需要GetNode(i).data即可，不再写方法了</span></span><br><span class="line"><span class="comment">  */</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> Node&lt;E&gt; <span class="title">GetNode</span><span class="params">(<span class="keyword">int</span> i)</span> </span>&#123;</span><br><span class="line"><span class="keyword">if</span> (i &lt; <span class="number">0</span> || i &gt; count) &#123;</span><br><span class="line"><span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(<span class="string">"元素位置错误！"</span>);</span><br><span class="line">    &#125; <span class="keyword">else</span> <span class="keyword">if</span> (i == <span class="number">0</span>) &#123;</span><br><span class="line">    <span class="keyword">return</span> head;    <span class="comment">//第0个节点为head</span></span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;   <span class="comment">//1 &lt;= i &lt;= count</span></span><br><span class="line">    Node&lt;E&gt; node = head.next;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> k = <span class="number">1</span>; k &lt; i; k++) &#123;</span><br><span class="line">    node = node.next;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> node;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment">* 删除第i个位置元素，并返回其值</span></span><br><span class="line"><span class="comment">*/</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> E <span class="title">ListDelete</span><span class="params">(<span class="keyword">int</span> i)</span> </span>&#123;</span><br><span class="line"><span class="keyword">if</span> (i &lt; <span class="number">1</span> || i &gt; count)</span><br><span class="line"><span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(<span class="string">"删除位置错误！"</span>);</span><br><span class="line">Node&lt;E&gt; node = GetNode(i);</span><br><span class="line">   E e = node.data;</span><br><span class="line">   GetNode(i - <span class="number">1</span>).next = node.next;</span><br><span class="line">   node = <span class="keyword">null</span>;</span><br><span class="line">   count--;</span><br><span class="line">   System.out.println(<span class="string">"删除成功!"</span>);</span><br><span class="line">   <span class="keyword">return</span> e;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><strong>单链表的查找元素，0代表失败：</strong><br>算法思路：</p><ul><li>首先定义一个node节点，node结点为head结点的下一个结点，然后判断node结点的数据是否等于e,若等于e则表示成功，返回1；若不等于e,则从第一个元素开始从前到后便利每一个元素， node = node.next;然后判断node结点的数据是否等于e,若等于则返回k+1;</li></ul><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment">  * 查找元素，0代表查找失败</span></span><br><span class="line"><span class="comment">  */</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">int</span> <span class="title">LocateElem</span><span class="params">(E e)</span> </span>&#123;</span><br><span class="line">Node&lt;E&gt; node;</span><br><span class="line">node = head.next;</span><br><span class="line"><span class="keyword">if</span> (node.data == e)</span><br><span class="line"><span class="keyword">return</span> <span class="number">1</span>;</span><br><span class="line">   <span class="keyword">for</span> (<span class="keyword">int</span> k = <span class="number">1</span>; k &lt; count; k++) &#123; </span><br><span class="line">    node = node.next;</span><br><span class="line">        <span class="keyword">if</span> (node.data == e)</span><br><span class="line">         <span class="keyword">return</span> k + <span class="number">1</span>;</span><br><span class="line">   &#125;</span><br><span class="line">   System.out.println(<span class="string">"查找失败！"</span>);</span><br><span class="line">   <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><strong>实现程序</strong></p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.tongcaipay.merchant.apply.study;</span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 说明：</span></span><br><span class="line"><span class="comment"> * 1.《大话数据结构》中没有线性表的长度，但提到可以存储于头节点的数据域中。</span></span><br><span class="line"><span class="comment"> *   本程序的线性表长度存放于count变量中，线性表长度可以使程序比较方便。</span></span><br><span class="line"><span class="comment"> * 2.程序中，第i个位置代表第i个结点，头结点属于第0个结点</span></span><br><span class="line"><span class="comment"> * 3.因为链表为泛型，整表创建采用整型（随机整数做元素），所以有出现一些类型转换</span></span><br><span class="line"><span class="comment"> * 4.Java程序的方法一般以小写开头，但为和书上一致，程序中方法采用了大写开头。</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * 注意点：</span></span><br><span class="line"><span class="comment"> * 1.count在增删元素时要加一或减一千万别忘了</span></span><br><span class="line"><span class="comment"> * 2.清空线性表要每个元素都null</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * @ xiao lei</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">LinkList</span>&lt;<span class="title">E</span>&gt; </span>&#123;</span><br><span class="line">    <span class="keyword">private</span> Node&lt;E&gt; head;  <span class="comment">//头结点</span></span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">int</span> count;  <span class="comment">//线性表长度</span></span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 　定义一个节点结点Node</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">private</span> <span class="class"><span class="keyword">class</span> <span class="title">Node</span>&lt;<span class="title">E</span>&gt; </span>&#123;</span><br><span class="line">        E data;  <span class="comment">//数据域</span></span><br><span class="line">        Node&lt;E&gt; next;  <span class="comment">//指针域</span></span><br><span class="line"></span><br><span class="line">        <span class="function"><span class="keyword">public</span> <span class="title">Node</span><span class="params">(E data, Node&lt;E&gt; next)</span> </span>&#123;</span><br><span class="line">            <span class="keyword">this</span>.data = data;</span><br><span class="line">            <span class="keyword">this</span>.next = next;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">        <span class="comment">/**</span></span><br><span class="line"><span class="comment">         * 线性表的初始化</span></span><br><span class="line"><span class="comment">         */</span></span><br><span class="line">        <span class="function"><span class="keyword">public</span> <span class="title">LinkList</span><span class="params">()</span> </span>&#123;</span><br><span class="line">            head = <span class="keyword">new</span> Node&lt;E&gt;(<span class="keyword">null</span>,<span class="keyword">null</span>);  <span class="comment">//不是head=null;</span></span><br><span class="line">            count = <span class="number">0</span>;  <span class="comment">//线性表第长度</span></span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="comment">/**</span></span><br><span class="line"><span class="comment">         * 判断线性表是否为空</span></span><br><span class="line"><span class="comment">         */</span></span><br><span class="line">        <span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">IsEmpty</span><span class="params">()</span> </span>&#123;</span><br><span class="line">            <span class="keyword">if</span> (count == <span class="number">0</span>) &#123;</span><br><span class="line">                System.out.println(<span class="string">"表为空！"</span>);</span><br><span class="line">                <span class="keyword">return</span> <span class="keyword">true</span>;</span><br><span class="line">            &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">                System.out.println(<span class="string">"表不为空！"</span>);</span><br><span class="line">                <span class="keyword">return</span> <span class="keyword">false</span>;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="comment">//return count==0;</span></span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">        <span class="comment">/**</span></span><br><span class="line"><span class="comment">         * 清空线性表</span></span><br><span class="line"><span class="comment">         */</span></span><br><span class="line">        <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">ClearList</span><span class="params">()</span> </span>&#123;</span><br><span class="line">            Node&lt;E&gt; node;</span><br><span class="line">            <span class="keyword">while</span> (count != <span class="number">0</span>) &#123;</span><br><span class="line">                node = head.next;</span><br><span class="line">                head.next = node.next;</span><br><span class="line">                node = <span class="keyword">null</span>;</span><br><span class="line">                count--;</span><br><span class="line">            &#125;</span><br><span class="line">            System.out.println(<span class="string">"线性表已清空！"</span>);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="comment">/**</span></span><br><span class="line"><span class="comment">         * 获取第i个结点（包括第0个结点，头结点）</span></span><br><span class="line"><span class="comment">         * 获取结点值只需要GetNode(i).data即可，不再写方法了</span></span><br><span class="line"><span class="comment">         */</span></span><br><span class="line">        <span class="function"><span class="keyword">public</span> Node&lt;E&gt; <span class="title">GetNode</span><span class="params">(<span class="keyword">int</span> i)</span> </span>&#123;</span><br><span class="line">            <span class="keyword">if</span> (i &lt; <span class="number">0</span> || i &gt; count) &#123;</span><br><span class="line">                <span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(<span class="string">"元素位置错误！"</span>);</span><br><span class="line">            &#125; <span class="keyword">else</span> <span class="keyword">if</span> (i == <span class="number">0</span>) &#123;</span><br><span class="line">                <span class="keyword">return</span> head;    <span class="comment">//第0个节点为head</span></span><br><span class="line">            &#125; <span class="keyword">else</span> &#123;   <span class="comment">//1 &lt;= i &lt;= count</span></span><br><span class="line">                Node&lt;E&gt; node = head.next;</span><br><span class="line">                <span class="keyword">for</span> (<span class="keyword">int</span> k = <span class="number">1</span>; k &lt; i; k++) &#123;</span><br><span class="line">                    node = node.next;</span><br><span class="line">                &#125;</span><br><span class="line">                <span class="keyword">return</span> node;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="comment">/**</span></span><br><span class="line"><span class="comment">         * 获取第i个结点的数据(包括头结点)</span></span><br><span class="line"><span class="comment">         */</span></span><br><span class="line">        <span class="function"><span class="keyword">public</span> E <span class="title">GetData</span><span class="params">(<span class="keyword">int</span> i)</span> </span>&#123;</span><br><span class="line">            <span class="keyword">return</span> GetNode(i).data;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="comment">/**</span></span><br><span class="line"><span class="comment">         * 查找元素，0代表查找失败</span></span><br><span class="line"><span class="comment">         */</span></span><br><span class="line">        <span class="function"><span class="keyword">public</span> <span class="keyword">int</span> <span class="title">LocateElem</span><span class="params">(E e)</span> </span>&#123;</span><br><span class="line">            Node&lt;E&gt; node;</span><br><span class="line">            node = head.next;</span><br><span class="line">            <span class="keyword">if</span> (node.data == e)</span><br><span class="line">                <span class="keyword">return</span> <span class="number">1</span>;</span><br><span class="line">            <span class="keyword">for</span> (<span class="keyword">int</span> k = <span class="number">1</span>; k &lt; count; k++) &#123;</span><br><span class="line">                node = node.next;</span><br><span class="line">                <span class="keyword">if</span> (node.data == e)</span><br><span class="line">                    <span class="keyword">return</span> k + <span class="number">1</span>;</span><br><span class="line">            &#125;</span><br><span class="line">            System.out.println(<span class="string">"查找失败！"</span>);</span><br><span class="line">            <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="comment">/**</span></span><br><span class="line"><span class="comment">         * 第i个位置插入新的元素</span></span><br><span class="line"><span class="comment">         */</span></span><br><span class="line">        <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">ListInsert</span><span class="params">(<span class="keyword">int</span> i, E e)</span> </span>&#123;</span><br><span class="line">            <span class="keyword">if</span> (i &lt; <span class="number">1</span> || i &gt; count + <span class="number">1</span>) &#123;</span><br><span class="line">                <span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(<span class="string">"插入位置错误！"</span>);</span><br><span class="line">            &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">                Node&lt;E&gt; newNode = <span class="keyword">new</span> Node&lt;E&gt;(e, <span class="keyword">null</span>);</span><br><span class="line">                newNode.next = GetNode(i - <span class="number">1</span>).next;  <span class="comment">//因为GetNode()方法中包含了获取头结点，所以不需单独判断了</span></span><br><span class="line">                GetNode(i - <span class="number">1</span>).next = newNode;</span><br><span class="line">                count++;</span><br><span class="line">                System.out.println(<span class="string">"插入成功！"</span>);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="comment">/**</span></span><br><span class="line"><span class="comment">         * 删除第i个位置元素，并返回其值</span></span><br><span class="line"><span class="comment">         */</span></span><br><span class="line">        <span class="function"><span class="keyword">public</span> E <span class="title">ListDelete</span><span class="params">(<span class="keyword">int</span> i)</span> </span>&#123;</span><br><span class="line">            <span class="keyword">if</span> (i &lt; <span class="number">1</span> || i &gt; count) &#123;</span><br><span class="line">                <span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(<span class="string">"删除位置错误！"</span>);</span><br><span class="line">            &#125;<span class="keyword">else</span> &#123;</span><br><span class="line">                Node&lt;E&gt; node = GetNode(i);</span><br><span class="line">                E e = node.data;</span><br><span class="line">                GetNode(i - <span class="number">1</span>).next = node.next;</span><br><span class="line">                node = <span class="keyword">null</span>;</span><br><span class="line">                count--;</span><br><span class="line">                System.out.println(<span class="string">"删除成功!"</span>);</span><br><span class="line">                <span class="keyword">return</span> e;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">        <span class="comment">/**</span></span><br><span class="line"><span class="comment">         * 获取线性表长度</span></span><br><span class="line"><span class="comment">         */</span></span><br><span class="line">        <span class="function"><span class="keyword">public</span> <span class="keyword">int</span> <span class="title">ListLength</span><span class="params">()</span> </span>&#123;</span><br><span class="line">            <span class="keyword">return</span> count;</span><br><span class="line">        &#125;</span><br></pre></td></tr></table></figure><p>测试代码：</p><p>　　基本数据类型和引用类型各写了一个测试代码。　　</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> </span>&#123;</span><br><span class="line">           LinkList&lt;Integer&gt; nums = <span class="keyword">new</span> LinkList&lt;Integer&gt;();</span><br><span class="line">           System.out.println(<span class="string">"——————————插入5个元素到表中,并读取内容——————————"</span>);</span><br><span class="line">           <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i &lt;= <span class="number">5</span>; i++)</span><br><span class="line">               nums.ListInsert(i, <span class="number">2</span> * i);</span><br><span class="line">           nums.IsEmpty();</span><br><span class="line">           <span class="keyword">int</span> num;</span><br><span class="line">           <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i &lt;= <span class="number">5</span>; i++) &#123;</span><br><span class="line">               num = nums.GetData(i);</span><br><span class="line">               System.out.println(<span class="string">"第"</span> + i + <span class="string">"个位置的值为："</span> + num);</span><br><span class="line">           &#125;</span><br><span class="line">           System.out.println(<span class="string">"——————————查找0、2、10是否在表中——————————"</span>);</span><br><span class="line">           System.out.print(<span class="string">"0的位置："</span>);</span><br><span class="line">           System.out.println(nums.LocateElem(<span class="number">0</span>));</span><br><span class="line">           System.out.print(<span class="string">"2的位置："</span>);</span><br><span class="line">           System.out.println(nums.LocateElem(<span class="number">2</span>));</span><br><span class="line">           System.out.print(<span class="string">"10的位置："</span>);</span><br><span class="line">           System.out.println(nums.LocateElem(<span class="number">10</span>));</span><br><span class="line">           System.out.println(<span class="string">"——————————删除2、10——————————"</span>);</span><br><span class="line">           num = nums.ListDelete(<span class="number">1</span>);</span><br><span class="line">           System.out.println(<span class="string">"已删除："</span> + num);</span><br><span class="line">           num = nums.ListDelete(<span class="number">4</span>);</span><br><span class="line">           System.out.println(<span class="string">"已删除："</span> + num);</span><br><span class="line">           System.out.println(<span class="string">"当前表长："</span> + nums.ListLength());</span><br><span class="line">           <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i &lt;= nums.ListLength(); i++) &#123;</span><br><span class="line">               num = nums.GetData(i);</span><br><span class="line">               System.out.println(<span class="string">"第"</span> + i + <span class="string">"个位置的值为："</span> + num);</span><br><span class="line">           &#125;</span><br><span class="line">           nums.ClearList();</span><br><span class="line">           nums.IsEmpty();</span><br><span class="line">       &#125;</span><br></pre></td></tr></table></figure><p><strong>实验结果</strong>：<br><img src="//xiaolei19991030x.github.io/数据结构/page-9/20.png" alt="20"></p><p>单链表与顺序存储结构的对比：<br><img src="//xiaolei19991030x.github.io/数据结构/page-9/21.png" alt="21"></p>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;补充基础知识～&lt;/p&gt;
&lt;p&gt;数据结构这门课程在以前学习过，但是由于当时学得比较一般就感觉并没有学到什么，于是在朋友的推荐下看《大话数据结构》，对于我这种小白来说是很友好的。整本书都感觉很通俗易懂，不像以前那样几乎看不懂。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;//xiaolei19991030x.github.io/数据结构/page-9/1.png&quot; alt=&quot;1&quot;&gt;&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
      <category term="数据结构" scheme="https%EF%BC%9A//xiaolei19991030x.github.io/categories/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/"/>
    
    
      <category term="学习笔记" scheme="https%EF%BC%9A//xiaolei19991030x.github.io/tags/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
      <category term="数据结构" scheme="https%EF%BC%9A//xiaolei19991030x.github.io/tags/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/"/>
    
      <category term="线性表" scheme="https%EF%BC%9A//xiaolei19991030x.github.io/tags/%E7%BA%BF%E6%80%A7%E8%A1%A8/"/>
    
      <category term="单链表" scheme="https%EF%BC%9A//xiaolei19991030x.github.io/tags/%E5%8D%95%E9%93%BE%E8%A1%A8/"/>
    
  </entry>
  
  <entry>
    <title>LinkList详解</title>
    <link href="https%EF%BC%9A//xiaolei19991030x.github.io/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/page-8/"/>
    <id>https：//xiaolei19991030x.github.io/数据结构/page-8/</id>
    <published>2019-09-04T15:02:14.000Z</published>
    <updated>2019-09-04T15:04:50.044Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="\assets\js\Meting.min.js"></script><p>1.LinkedList类定义</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">LinkedList</span>&lt;<span class="title">E</span>&gt;</span></span><br><span class="line"><span class="class">     <span class="keyword">extends</span> <span class="title">AbstractSequentialList</span>&lt;<span class="title">E</span>&gt;</span></span><br><span class="line"><span class="class">     <span class="keyword">implements</span> <span class="title">List</span>&lt;<span class="title">E</span>&gt;, <span class="title">Deque</span>&lt;<span class="title">E</span>&gt;, <span class="title">Cloneable</span>, <span class="title">java</span>.<span class="title">io</span>.<span class="title">Serializable</span></span></span><br></pre></td></tr></table></figure><a id="more"></a><ul><li>LinkedList 是一个继承于 <font color="blue">AbstractSequentialList</font> 的双向链表。它也可以被当作堆栈、队列或双端队列进行操作。</li><li>LinkedList 实现 <font color="blue">List</font> 接口，能对它进行队列操作。</li><li>LinkedList 实现 <font color="blue">Deque</font>接口，即能将LinkedList当作双端队列使用。</li><li>LinkedList 实现了 <font color="blue">Cloneable</font> 接口，即覆盖了函数clone()，能克隆。</li><li>LinkedList 实现 <font color="blue">java.io.Serializable</font> 接口，这意味着LinkedList支持序列化，能通过序列化去传输。</li><li>LinkedList 是非同步的。</li></ul><p>LinkedList的类图关系：</p><p><img src="//xiaolei19991030x.github.io/数据结构/page-8/1.png" alt="1"></p><p>2.LinkedList数据结构<br>LinkedList的成员变量很少且只有三个：代表节点个数的 <font color="red">size</font>，前驱<font color="red">pre</font>和后继<font color="red">last</font>。Java中的LinkedList的数据结构是一个双向非循环链表，由内部类Node定义：</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">private</span> <span class="class"><span class="keyword">class</span> <span class="title">Node</span>&lt;<span class="title">T</span>&gt; </span>&#123;</span><br><span class="line">T data;</span><br><span class="line">Node&lt;T&gt; next;<span class="comment">//后继</span></span><br><span class="line">Node&lt;T&gt; pre;<span class="comment">//前驱</span></span><br><span class="line">   Node(T t) &#123;</span><br><span class="line">       <span class="keyword">this</span>.data = t;</span><br><span class="line">   &#125;</span><br><span class="line">｝</span><br></pre></td></tr></table></figure><p>3.构造器<br>定义一个<font color="red">first</font>,<font color="red">last</font>,以及链表当长度，但是头部和尾部要设置为空。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">Node&lt;T&gt; frist;  <span class="comment">//头部</span></span><br><span class="line">Node&lt;T&gt; last;   <span class="comment">//尾部</span></span><br><span class="line"><span class="keyword">int</span> size;<span class="comment">//链表长度</span></span><br><span class="line"><span class="comment">//底层数组</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="title">LinkedList</span><span class="params">()</span> </span>&#123;</span><br><span class="line">frist = last = <span class="keyword">null</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>4.LinkedList核心操作:</p><ul><li><font color="red">add(T e)</font></li><li><font color="red">add(int index, T e)</font></li><li><font color="red">set(int index, T e)</font></li><li><font color="red">get(int index)</font></li><li><font color="red">remove(int index)</font></li><li><font color="red">remove(T e)</font></li><li><font color="red">int size()</font></li><li><font color="red">boolean isEmpty()</font></li><li><font color="red">forEach(Consumer<t> action)</t></font></li></ul><p>1) <strong>add(T e)</strong><br>在末尾添加一个元素</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Override</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">add</span><span class="params">(T e)</span> </span>&#123;</span><br><span class="line">Node&lt;T&gt; n = <span class="keyword">new</span> Node&lt;T&gt;(e);</span><br><span class="line">   <span class="keyword">if</span> (last == <span class="keyword">null</span>) &#123;</span><br><span class="line">   frist = n;</span><br><span class="line">       last = n;</span><br><span class="line">   &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">       last.next = n;<span class="comment">//最后一个元素下一个为此次添加的元素</span></span><br><span class="line">       n.pre = last;<span class="comment">//添加元素的前驱指前一个元素</span></span><br><span class="line">       last = n;<span class="comment">//此时最后一个元素为刚添加进入的</span></span><br><span class="line">        &#125;</span><br><span class="line">        size++;</span><br><span class="line">    &#125;</span><br></pre></td></tr></table></figure><p>说明：当在末尾添加元素的时候，先要判断尾部元素是否为空，若为空则说明只有一个元素，则直接把该元素放在里面；若尾部元素不为空的，则最后一个元素下一个为此次添加的元素，添加的元素的前驱指向前一个元素，那么此时最后一个元素为刚刚添加进入的。<br>2) <strong>add(int index, T e)</strong><br> 在指定下标 index 位置中添加一个元素</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">private</span> Node&lt;T&gt; <span class="title">getNode</span><span class="params">(<span class="keyword">int</span> index)</span> </span>&#123;</span><br><span class="line"> <span class="keyword">if</span> (index &gt;= size || index &lt; <span class="number">0</span>) &#123;</span><br><span class="line"> <span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(<span class="string">"数组越界"</span>);</span><br><span class="line"> &#125;</span><br><span class="line">   Node temp = frist;</span><br><span class="line">   <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; index; i++) &#123;</span><br><span class="line">   temp = temp.next;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> temp;</span><br><span class="line">&#125;</span><br><span class="line"><span class="meta">@Override</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">add</span><span class="params">(<span class="keyword">int</span> index, T e)</span> </span>&#123;</span><br><span class="line">Node&lt;T&gt; newNode = <span class="keyword">new</span> Node&lt;T&gt;(e);</span><br><span class="line"><span class="comment">// 数组越界</span></span><br><span class="line">   <span class="keyword">if</span> (index &lt; <span class="number">0</span> || index &gt; size) &#123;</span><br><span class="line">       <span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(<span class="string">"数组越界"</span>);</span><br><span class="line">   &#125;</span><br><span class="line">   <span class="comment">// 末尾元素</span></span><br><span class="line">   <span class="keyword">if</span> (index == size) &#123;</span><br><span class="line">   last.next = newNode;</span><br><span class="line">   newNode.pre = last;</span><br><span class="line">   last = newNode;</span><br><span class="line">   size++;</span><br><span class="line">   <span class="keyword">return</span>;</span><br><span class="line">   &#125;</span><br><span class="line">   <span class="comment">// 中间元素</span></span><br><span class="line">   Node temp = getNode(index);</span><br><span class="line">   temp.pre.next = newNode;</span><br><span class="line">   newNode.pre = temp.pre;</span><br><span class="line">   temp.pre = newNode;</span><br><span class="line">   newNode.next = temp;</span><br><span class="line">   size++;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>说明：此时需要进行分段考虑。</p><ul><li>当 index &lt; 0 或者 index &gt; size 时，则为数组越界</li><li>当 index = size 时，此时相当于在末尾添加一个元素，在链表当范围之内，所以直接添加进去。</li><li>最后一种情况就是当在中间元素的时候，此时就比较麻烦，需要改变next和pre的方向。<br><img src="//xiaolei19991030x.github.io/数据结构/page-8/2.png" alt="2"></li></ul><p>3) <strong>set(int index, T e)</strong><br>在指定下标 index 位置中设置一个元素，返回旧值</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">private</span> Node&lt;T&gt; <span class="title">getNode</span><span class="params">(<span class="keyword">int</span> index)</span> </span>&#123;</span><br><span class="line"> <span class="keyword">if</span> (index &gt;= size || index &lt; <span class="number">0</span>) &#123;</span><br><span class="line"> <span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(<span class="string">"数组越界"</span>);</span><br><span class="line"> &#125;</span><br><span class="line">   Node temp = frist;</span><br><span class="line">   <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; index; i++) &#123;</span><br><span class="line">   temp = temp.next;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> temp;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="meta">@Override</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> T <span class="title">set</span><span class="params">(<span class="keyword">int</span> index, T e)</span> </span>&#123;</span><br><span class="line"><span class="comment">//数组越界</span></span><br><span class="line"><span class="keyword">if</span> (index &gt; size || index &lt; <span class="number">0</span>) &#123;</span><br><span class="line"><span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(<span class="string">"数组越界"</span>);</span><br><span class="line">   &#125; <span class="keyword">else</span> <span class="keyword">if</span> (index == size) &#123;</span><br><span class="line">Node&lt;T&gt; newNode = <span class="keyword">new</span> Node&lt;&gt;(e);</span><br><span class="line">last.next = newNode;</span><br><span class="line">newNode.pre = last;</span><br><span class="line">last = newNode;</span><br><span class="line">size++;</span><br><span class="line"><span class="keyword">return</span> <span class="keyword">null</span>;</span><br><span class="line">&#125; <span class="keyword">else</span> &#123; <span class="comment">//中间元素</span></span><br><span class="line">Node&lt;T&gt; node = getNode(index);</span><br><span class="line">T oldData = node.data;</span><br><span class="line">node.data = e;</span><br><span class="line"><span class="keyword">return</span> oldData;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>说明：此时还是需要进行分段讨论</p><ul><li>当 index &lt; 0 或者 index &gt; size 时，则为数组越界</li><li>当 index = size 时，此时相当于在末尾设置元素，在链表当范围之内，所以直接添加进去。</li><li>当在中间设置时，首先设置下标为index的元素oldData为node.data,再将元素e赋值为node.data,  最后返回oldData的值。</li></ul><p>4) <strong>get(int index)</strong><br>根据指定下标获取元素</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Override</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> T <span class="title">get</span><span class="params">(<span class="keyword">int</span> index)</span> </span>&#123;</span><br><span class="line"><span class="keyword">if</span> (index &lt; size &amp;&amp; index &gt;= <span class="number">0</span>) &#123;</span><br><span class="line"><span class="keyword">return</span> getNode(index).data;</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">    <span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(<span class="string">"数组越界"</span>);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>说明：当 0&lt;=index&lt;size时，返回指定下标下的值；其余情况下为数组越界。</p><p>5) <strong>remove(int index)</strong><br>根据指定下标 index 删除指定元素，并返回删除的值</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Override</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> T <span class="title">remove</span><span class="params">(<span class="keyword">int</span> index)</span> </span>&#123;</span><br><span class="line"><span class="keyword">if</span> (index &lt; <span class="number">0</span> || index &gt;= size) &#123;</span><br><span class="line">            <span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(<span class="string">"数组越界"</span>);</span><br><span class="line">   &#125;</span><br><span class="line"></span><br><span class="line">   <span class="keyword">if</span>(index == <span class="number">0</span>)&#123;</span><br><span class="line">   Node&lt;T&gt; node = frist;</span><br><span class="line">    frist = frist.next;</span><br><span class="line">    size--;</span><br><span class="line">       <span class="keyword">return</span> node.data;</span><br><span class="line">   &#125;<span class="keyword">else</span>&#123;</span><br><span class="line">       Node&lt;T&gt; temp = getNode(index);</span><br><span class="line">       temp.next.pre = temp.pre;</span><br><span class="line">       <span class="comment">//再将temp的前驱的后继指向temp的后继</span></span><br><span class="line">       temp.pre.next = temp.next;</span><br><span class="line">       size--;</span><br><span class="line">       <span class="keyword">return</span> temp.data;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>说明：此时需要进行分组讨论：</p><ul><li>当index &lt; 0 或者 index &gt;= size时，此时为数组越界</li><li>当 index = 0时，此时只有一个空链表。如图所示，然后</li></ul><p><img src="//xiaolei19991030x.github.io/数据结构/page-8/4.png" alt="4"></p><ul><li>中间元素的删除：<br><img src="//xiaolei19991030x.github.io/数据结构/page-8/3.png" alt="3"></li></ul><p>5) <strong>boolean remove(T e)</strong><br>删除指定的值，并返回是否删除成功</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Override</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">remove</span><span class="params">(T e)</span> </span>&#123;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; size; i++) &#123;</span><br><span class="line"><span class="keyword">if</span> (get(i).equals(e)) &#123;</span><br><span class="line">remove(i);</span><br><span class="line">          <span class="keyword">break</span>;</span><br><span class="line">       &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> <span class="keyword">true</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>6) <strong>int size()</strong><br>获取列表大小 </p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Override</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">int</span> <span class="title">size</span><span class="params">()</span> </span>&#123;</span><br><span class="line"><span class="keyword">return</span> size;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>7) <strong>boolean isEmpty()</strong><br>判断是否为空</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Override</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">isEmpty</span><span class="params">()</span> </span>&#123;</span><br><span class="line"><span class="keyword">if</span> (size == <span class="number">0</span>) &#123;</span><br><span class="line"><span class="keyword">return</span> <span class="keyword">true</span>;</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">       <span class="keyword">return</span> <span class="keyword">false</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>8) <strong>forEach(Consumer<t> action)</t></strong><br>遍历所有元素</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Override</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">forEach</span><span class="params">(Consumer&lt;T&gt; action)</span> </span>&#123;</span><br><span class="line">Node&lt;T&gt;currentNode = frist;</span><br><span class="line"><span class="keyword">while</span> (currentNode != <span class="keyword">null</span>) &#123;</span><br><span class="line">action.accept(currentNode.data);</span><br><span class="line">currentNode = currentNode.next;</span><br><span class="line">       &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>5.总结<br> LinkedList使用了循环双向链表数据结构进行实现，通过改动指针的方向来添加或删除某个元素，但是读的速度很慢，删除很方便。</p><p>6.源代码</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.tongcaipay.merchant.apply.study;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.function.Consumer;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">LinkedList</span>&lt;<span class="title">T</span>&gt; <span class="keyword">implements</span> <span class="title">List</span>&lt;<span class="title">T</span>&gt; </span>&#123;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">private</span> <span class="class"><span class="keyword">class</span> <span class="title">Node</span>&lt;<span class="title">T</span>&gt; </span>&#123;</span><br><span class="line">        T data;</span><br><span class="line">        Node&lt;T&gt; next;<span class="comment">//后继</span></span><br><span class="line">        Node&lt;T&gt; pre;<span class="comment">//前驱</span></span><br><span class="line"></span><br><span class="line">        Node(T t) &#123;</span><br><span class="line">            <span class="keyword">this</span>.data = t;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    Node&lt;T&gt; frist;  <span class="comment">//头部</span></span><br><span class="line">    Node&lt;T&gt; last;   <span class="comment">//尾部</span></span><br><span class="line">    <span class="keyword">int</span> size;<span class="comment">//链表长度</span></span><br><span class="line">    <span class="comment">//底层数组</span></span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="title">LinkedList</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        frist = last = <span class="keyword">null</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">add</span><span class="params">(T e)</span> </span>&#123;</span><br><span class="line">        Node&lt;T&gt; n = <span class="keyword">new</span> Node&lt;T&gt;(e);</span><br><span class="line">        <span class="keyword">if</span> (last == <span class="keyword">null</span>) &#123;</span><br><span class="line">            frist = n;</span><br><span class="line">            last = n;</span><br><span class="line">        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">            last.next = n;<span class="comment">//最后一个元素下一个为此次添加的元素</span></span><br><span class="line">            n.pre = last;<span class="comment">//添加元素的前驱指前一个元素</span></span><br><span class="line">            last = n;<span class="comment">//此时最后一个元素为刚添加进入的</span></span><br><span class="line">        &#125;</span><br><span class="line">        size++;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">private</span> Node&lt;T&gt; <span class="title">getNode</span><span class="params">(<span class="keyword">int</span> index)</span> </span>&#123;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> (index &gt;= size || index &lt; <span class="number">0</span>) &#123;</span><br><span class="line">            <span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(<span class="string">"数组越界"</span>);</span><br><span class="line">        &#125;</span><br><span class="line">        Node temp = frist;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; index; i++) &#123;</span><br><span class="line">            temp = temp.next;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">return</span> temp;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">add</span><span class="params">(<span class="keyword">int</span> index, T e)</span> </span>&#123;</span><br><span class="line">        Node&lt;T&gt; newNode = <span class="keyword">new</span> Node&lt;T&gt;(e);</span><br><span class="line">        <span class="comment">// 数组越界</span></span><br><span class="line">        <span class="keyword">if</span> (index &lt; <span class="number">0</span> || index &gt; size) &#123;</span><br><span class="line">            <span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(<span class="string">"数组越界"</span>);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 末尾元素</span></span><br><span class="line">        <span class="keyword">if</span> (index == size) &#123;</span><br><span class="line">            last.next = newNode;</span><br><span class="line">            newNode.pre = last;</span><br><span class="line">            last = newNode;</span><br><span class="line">            size++;</span><br><span class="line">            <span class="keyword">return</span>;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 中间元素</span></span><br><span class="line">        Node temp = getNode(index);</span><br><span class="line">        temp.pre.next = newNode;</span><br><span class="line">        newNode.pre = temp.pre;</span><br><span class="line">        temp.pre = newNode;</span><br><span class="line">        newNode.next = temp;</span><br><span class="line">        size++;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> T <span class="title">set</span><span class="params">(<span class="keyword">int</span> index, T e)</span> </span>&#123;</span><br><span class="line">        <span class="comment">//数组越界</span></span><br><span class="line">        <span class="keyword">if</span> (index &gt; size || index &lt; <span class="number">0</span>) &#123;</span><br><span class="line">            <span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(<span class="string">"数组越界"</span>);</span><br><span class="line">        &#125; <span class="keyword">else</span> <span class="keyword">if</span> (index == size) &#123;</span><br><span class="line">            Node&lt;T&gt; newNode = <span class="keyword">new</span> Node&lt;T&gt;(e);</span><br><span class="line">            last.next = newNode;</span><br><span class="line">            newNode.pre = last;</span><br><span class="line">            last = newNode;</span><br><span class="line">            size++;</span><br><span class="line">            <span class="keyword">return</span> <span class="keyword">null</span>;</span><br><span class="line">        &#125; <span class="keyword">else</span> &#123; <span class="comment">//中间元素</span></span><br><span class="line">            Node&lt;T&gt; node = getNode(index);</span><br><span class="line">            T oldData = node.data;</span><br><span class="line">            node.data = e;</span><br><span class="line">            <span class="keyword">return</span> oldData;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> T <span class="title">get</span><span class="params">(<span class="keyword">int</span> index)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (index &lt; size &amp;&amp; index &gt;= <span class="number">0</span>) &#123;</span><br><span class="line">            <span class="keyword">return</span> getNode(index).data;</span><br><span class="line">        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">            <span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(<span class="string">"数组越界"</span>);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> T <span class="title">remove</span><span class="params">(<span class="keyword">int</span> index)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (index &lt; <span class="number">0</span> || index &gt;= size) &#123;</span><br><span class="line">            <span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(<span class="string">"数组越界"</span>);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span>(index == <span class="number">0</span>)&#123;</span><br><span class="line">            Node&lt;T&gt; node = frist;</span><br><span class="line">            frist = frist.next;</span><br><span class="line">            size--;</span><br><span class="line">            <span class="keyword">return</span> node.data;</span><br><span class="line">        &#125;<span class="keyword">else</span>&#123;</span><br><span class="line">            Node&lt;T&gt; temp = getNode(index);</span><br><span class="line">            temp.next.pre = temp.pre;</span><br><span class="line">            <span class="comment">//再将temp的前驱的后继指向temp的后继</span></span><br><span class="line">            temp.pre.next = temp.next;</span><br><span class="line">            size--;</span><br><span class="line">            <span class="keyword">return</span> temp.data;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">remove</span><span class="params">(T e)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; size; i++) &#123;</span><br><span class="line">            <span class="keyword">if</span> (get(i).equals(e)) &#123;</span><br><span class="line">                remove(i);</span><br><span class="line">                <span class="keyword">break</span>;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">true</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">int</span> <span class="title">size</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> size;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">isEmpty</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (size == <span class="number">0</span>) &#123;</span><br><span class="line">            <span class="keyword">return</span> <span class="keyword">true</span>;</span><br><span class="line">        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">            <span class="keyword">return</span> <span class="keyword">false</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">forEach</span><span class="params">(Consumer&lt;T&gt; action)</span> </span>&#123;</span><br><span class="line">        Node&lt;T&gt;currentNode = frist;</span><br><span class="line">        <span class="keyword">while</span> (currentNode != <span class="keyword">null</span>) &#123;</span><br><span class="line">            action.accept(currentNode.data);</span><br><span class="line">            currentNode = currentNode.next;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> </span>&#123;</span><br><span class="line">        List&lt;String&gt; list = <span class="keyword">new</span> LinkedList&lt;&gt;();</span><br><span class="line">        list.add(<span class="string">"1"</span>);</span><br><span class="line">        list.add(<span class="string">"2"</span>);</span><br><span class="line">        list.add(<span class="string">"3"</span>);</span><br><span class="line">        list.add(<span class="string">"4"</span>);</span><br><span class="line">        <span class="comment">//list.add(3,"1");</span></span><br><span class="line">        list.remove(<span class="number">7</span>);</span><br><span class="line">        <span class="comment">//list.set(5,"1");</span></span><br><span class="line">        <span class="comment">//System.out.println(list.size());</span></span><br><span class="line">        <span class="comment">//System.out.println(list.get(4));</span></span><br><span class="line">        <span class="comment">//System.out.println(list.remove(3));</span></span><br><span class="line">        <span class="comment">//System.out.println(list.isEmpty());</span></span><br><span class="line">        <span class="comment">//System.out.println(list.size());</span></span><br><span class="line">        list.forEach(item -&gt; &#123;</span><br><span class="line">            System.out.println(item);</span><br><span class="line">        &#125;);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;1.LinkedList类定义&lt;/p&gt;
&lt;figure class=&quot;highlight java&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;class&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;title&quot;&gt;LinkedList&lt;/span&gt;&amp;lt;&lt;span class=&quot;title&quot;&gt;E&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;class&quot;&gt;     &lt;span class=&quot;keyword&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;title&quot;&gt;AbstractSequentialList&lt;/span&gt;&amp;lt;&lt;span class=&quot;title&quot;&gt;E&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;class&quot;&gt;     &lt;span class=&quot;keyword&quot;&gt;implements&lt;/span&gt; &lt;span class=&quot;title&quot;&gt;List&lt;/span&gt;&amp;lt;&lt;span class=&quot;title&quot;&gt;E&lt;/span&gt;&amp;gt;, &lt;span class=&quot;title&quot;&gt;Deque&lt;/span&gt;&amp;lt;&lt;span class=&quot;title&quot;&gt;E&lt;/span&gt;&amp;gt;, &lt;span class=&quot;title&quot;&gt;Cloneable&lt;/span&gt;, &lt;span class=&quot;title&quot;&gt;java&lt;/span&gt;.&lt;span class=&quot;title&quot;&gt;io&lt;/span&gt;.&lt;span class=&quot;title&quot;&gt;Serializable&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
    
    </summary>
    
      <category term="数据结构" scheme="https%EF%BC%9A//xiaolei19991030x.github.io/categories/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/"/>
    
    
      <category term="数据结构" scheme="https%EF%BC%9A//xiaolei19991030x.github.io/tags/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/"/>
    
      <category term="LinkList" scheme="https%EF%BC%9A//xiaolei19991030x.github.io/tags/LinkList/"/>
    
      <category term="循环链表" scheme="https%EF%BC%9A//xiaolei19991030x.github.io/tags/%E5%BE%AA%E7%8E%AF%E9%93%BE%E8%A1%A8/"/>
    
  </entry>
  
  <entry>
    <title>浅谈ArrayList</title>
    <link href="https%EF%BC%9A//xiaolei19991030x.github.io/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/page-7/"/>
    <id>https：//xiaolei19991030x.github.io/数据结构/page-7/</id>
    <published>2019-09-04T14:49:39.000Z</published>
    <updated>2019-09-04T14:52:30.640Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="\assets\js\Meting.min.js"></script><h3 id="一、ArrayList的继承体系及性质"><a href="#一、ArrayList的继承体系及性质" class="headerlink" title="一、ArrayList的继承体系及性质"></a>一、ArrayList的继承体系及性质</h3><p>1.ArrayList的继承体系<br><font color="blue">ArrayList</font><font color="red">类</font>继承<font color="blue">AbstractList</font>类，实现<font color="blue">List</font>等多个接口：<br><img src="//xiaolei19991030x.github.io/数据结构/page-7/1.png" alt="1"></p><a id="more"></a><p><font color="blue">AbstractList</font><font color="red">类</font>又继承<font color="blue">AbstractCollection</font>类，实现<font color="blue">List</font>接口：<br><img src="//xiaolei19991030x.github.io/数据结构/page-7/2.png" alt="2"></p><p><font color="blue">AbstractCollection</font><font color="red">类</font>实现<font color="blue">Collection</font>接口：<br><img src="//xiaolei19991030x.github.io/数据结构/page-7/3.png" alt="3"></p><p><font color="blue">Collection</font>接口继承<font color="blue">Iterable</font>接口：<br><img src="//xiaolei19991030x.github.io/数据结构/page-7/4.png" alt="4"></p><p><font color="blue">List</font>接口继承<font color="blue">Collection</font>接口：<br><img src="//xiaolei19991030x.github.io/数据结构/page-7/5.png" alt="5"></p><p>所以ArrayList总体继承体系为：<br><img src="//xiaolei19991030x.github.io/数据结构/page-7/6.png" alt="6"></p><h3 id="二、ArrayList的方法使用和源码解析"><a href="#二、ArrayList的方法使用和源码解析" class="headerlink" title="二、ArrayList的方法使用和源码解析"></a>二、ArrayList的方法使用和源码解析</h3><p>1.构造方法：</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">private</span> Object[] array;  <span class="comment">//定义一个泛型的数组array</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">private</span> <span class="keyword">int</span> size;   <span class="comment">//当前数组长度</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="title">ArrayList</span><span class="params">()</span> </span>&#123;</span><br><span class="line">       array = <span class="keyword">new</span> Object[<span class="number">10</span>];  <span class="comment">//默认情况下使用ArrayList会生成一个大小为10的Object类型的数组</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="title">ArrayList</span><span class="params">(<span class="keyword">int</span> capacity)</span> </span>&#123;</span><br><span class="line">       array = <span class="keyword">new</span> Object[capacity];      <span class="comment">//新建一个用户初始值大小的object数组。</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>默认情况下使用ArrayList会生成一个大小为10的Object类型的数组。</p><p>实例：</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> </span>&#123;</span><br><span class="line">        List&lt;String&gt; list1 = <span class="keyword">new</span> ArrayList&lt;&gt;();</span><br><span class="line">        list1.add(<span class="string">"1"</span>);</span><br><span class="line">        list1.add(<span class="string">"2"</span>);</span><br><span class="line">        list1.add(<span class="string">"3"</span>);</span><br><span class="line">        list1.add(<span class="string">"4"</span>);</span><br><span class="line">        <span class="comment">//list1.add(3,"1");</span></span><br><span class="line">        list1.remove(<span class="string">"2"</span>);</span><br><span class="line">        <span class="comment">//list1.set(2,"1");</span></span><br><span class="line">        <span class="comment">//System.out.println(list1.size());</span></span><br><span class="line">        <span class="comment">//System.out.println(list1.get(4));</span></span><br><span class="line">        <span class="comment">//System.out.println(list1.remove(3));</span></span><br><span class="line">        <span class="comment">//System.out.println(list1.isEmpty());</span></span><br><span class="line">        <span class="comment">//System.out.println(list1.size());</span></span><br><span class="line">        list1.forEach(item -&gt; &#123;</span><br><span class="line">            System.out.println(item);</span><br><span class="line">        &#125;);</span><br><span class="line"></span><br><span class="line">    &#125;</span><br></pre></td></tr></table></figure><p>2.<strong>add(T e)</strong>方法<br>功能：在末尾添加一个元素。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Override</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">add</span><span class="params">(T e)</span> </span>&#123;</span><br><span class="line">array[size++] = e;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>在数组的末尾元素时，当前的数组长度加一。</p><p>3.<strong>add(int index, T e)</strong>方法<br>功能：在指定下标 index 位置中设置一个元素，返回旧值</p><p>说明：加入元素e之前先要检查数组到大小首先检查index的值是否在0到size之间，可以为size.然后将index以及后面的元素向后面移动一位，将e放在index位置，size++。如果下标index不在0到size之间，则说明数组越界。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Override</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">add</span><span class="params">(<span class="keyword">int</span> index, T e)</span> </span>&#123;</span><br><span class="line"><span class="keyword">if</span> (index &gt; <span class="number">0</span> &amp;&amp; index &lt;= size) &#123;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = size - <span class="number">1</span>; i &gt;= size; i--) &#123;</span><br><span class="line">array[i + <span class="number">1</span>] = array[i];</span><br><span class="line">    &#125;</span><br><span class="line">    array[index] = e;</span><br><span class="line">    size++;</span><br><span class="line">    &#125;<span class="keyword">else</span>&#123;</span><br><span class="line">    <span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(<span class="string">"数组越界"</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>4.<strong>set(int index, T e)</strong>方法<br>功能：在指定下标 index 位置中设置一个元素，返回旧值</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Override</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> T <span class="title">set</span><span class="params">(<span class="keyword">int</span> index, T e)</span> </span>&#123;</span><br><span class="line"><span class="keyword">if</span> (index &gt; size || index&lt;<span class="number">0</span> ) &#123;</span><br><span class="line"><span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(<span class="string">"数组越界"</span>);</span><br><span class="line">    &#125;<span class="keyword">else</span> <span class="keyword">if</span>(index == size)&#123;</span><br><span class="line">    array[index] = e;</span><br><span class="line">       size++;</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">       array[index] = e;</span><br><span class="line">    &#125;</span><br><span class="line">       <span class="keyword">return</span> <span class="keyword">null</span>;  </span><br><span class="line">｝</span><br></pre></td></tr></table></figure><p>将e放到ArrayList下标为index的位置，此时就要分情况来讨论： </p><ul><li>当 index &lt; 0 或者 index &gt; size，说明数组越界了</li><li>当 index = size 时，相当于数组在末尾添加了一个新的元素，此时直接把元素e放在下标等于index的位置，当前size＋＋。</li><li>当 0&lt;=index&lt;size 时，说明在当前数组内，则直接把直接把元素e放在下标等于index的位置／</li></ul><p>5.<strong>get(int index)</strong>方法<br>功能：返回指定下标为index的元素</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Override</span></span><br><span class="line"><span class="function"><span class="keyword">public</span>  T <span class="title">get</span><span class="params">(<span class="keyword">int</span> index)</span> </span>&#123;</span><br><span class="line"><span class="keyword">if</span>(index &lt; size &amp;&amp; index&gt;=<span class="number">0</span>) &#123;</span><br><span class="line"><span class="keyword">return</span> (T) array[index];</span><br><span class="line">    &#125;<span class="keyword">else</span> &#123;</span><br><span class="line">       <span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(<span class="string">"数组越界"</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>说明：获取指定元素的时候，当 0&lt;=index&lt;size 时，此时在数组内，返回指定下标元素，其余情况数组越界会抛异常。</p><p>6.<strong>remove(int index)</strong>方法<br>功能：根据指定下标 index 删除指定元素，并返回删除的值</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Override</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> T <span class="title">remove</span><span class="params">(<span class="keyword">int</span> index)</span> </span>&#123;</span><br><span class="line"><span class="keyword">if</span>(index&gt;=<span class="number">0</span> &amp;&amp; index&lt;size) &#123;</span><br><span class="line">Object m = array[index];   <span class="comment">//获取删除元素的值</span></span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = index+<span class="number">1</span> ;i&lt;=size-<span class="number">1</span>;i++)&#123;</span><br><span class="line">array[i-<span class="number">1</span>] = array[i];    <span class="comment">//将index后面所有的元素往前移一位。</span></span><br><span class="line">    &#125;</span><br><span class="line">    size--;</span><br><span class="line">    <span class="keyword">return</span> (T) m;</span><br><span class="line">   &#125;<span class="keyword">else</span> &#123;</span><br><span class="line">       <span class="keyword">throw</span> <span class="keyword">new</span> RuntimeException(<span class="string">"数组越界"</span>);</span><br><span class="line">   &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>说明: 删除指定下标为index的元素的值前，首先要确定其范围，当 0&lt;=index&lt;size 时，此时在数组内，可以进行删除操作。首先获取要删除的元素的值将其定义成一个泛型 m,随后将下标为index后面的元素往前移动一位，比如将array[index＋1]移动到array[index]上，以此类推，然后数组当前大小还要－1，最后返回删除的m的值。如果不在0&lt;=index&lt;size视为数组越界。</p><p>7.<strong>boolean remove(Object o)</strong>方法<br>功能： 删除指定的值为e，并返回是否删除成功</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Override</span></span><br><span class="line"><span class="comment">//删除元素</span></span><br><span class="line"><span class="comment">//只会删除第一个出现的元素。</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">remove</span><span class="params">(Object o)</span> </span>&#123;</span><br><span class="line"><span class="keyword">if</span> (o == <span class="keyword">null</span>)&#123;</span><br><span class="line"><span class="comment">// for循环遍历元素。找出待删除元素的index</span></span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> index = <span class="number">0</span>;index &lt; size;index++)&#123;</span><br><span class="line">       <span class="keyword">if</span> (array[index] == <span class="keyword">null</span>) &#123;</span><br><span class="line">           remove(index);</span><br><span class="line">           <span class="comment">//此处导致只会删除第一个找到的相等元素</span></span><br><span class="line">              <span class="keyword">return</span> <span class="keyword">true</span>;</span><br><span class="line">          &#125;</span><br><span class="line">   &#125;<span class="keyword">else</span>&#123;</span><br><span class="line">    <span class="comment">// for循环遍历元素。找出待删除元素的index</span></span><br><span class="line">       <span class="keyword">for</span> (<span class="keyword">int</span> index = <span class="number">0</span>; index &lt; size; index++) &#123;</span><br><span class="line">         <span class="keyword">if</span> (e.equals(array[index])) &#123;</span><br><span class="line">              remove(index);</span><br><span class="line">              <span class="comment">//此处导致只会删除第一个找到的相等元素</span></span><br><span class="line">              <span class="keyword">return</span> <span class="keyword">true</span>;</span><br><span class="line">          &#125;</span><br><span class="line">       &#125;</span><br><span class="line">   &#125;</span><br><span class="line">   <span class="keyword">return</span> <span class="keyword">false</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>8.<strong>int size()</strong>方法<br>功能： 获取列表大小</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">int</span> <span class="title">size</span><span class="params">()</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> size;</span><br><span class="line">    &#125;</span><br></pre></td></tr></table></figure><p>9.<strong>boolean isEmpty()</strong>方法<br>功能： 判断是否为空</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Override</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">isEmpty</span><span class="params">()</span> </span>&#123;</span><br><span class="line"><span class="keyword">if</span>(size == <span class="number">0</span>)&#123;</span><br><span class="line"><span class="keyword">return</span> <span class="keyword">true</span>;</span><br><span class="line">        &#125;<span class="keyword">else</span>&#123;</span><br><span class="line">            <span class="keyword">return</span> <span class="keyword">false</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>10.<strong>forEach(Consumer<t> action)</t></strong>方法<br>功能：遍历整改数组</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Override</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">forEach</span><span class="params">(Consumer&lt;T&gt; action)</span> </span>&#123;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i = <span class="number">0</span>;i&lt;size;i++)&#123;</span><br><span class="line">    action.accept((T) array[i]);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="三、总结"><a href="#三、总结" class="headerlink" title="三、总结"></a>三、总结</h3><p>Arraylist实现是基于动态数组点数据结构，动态大小是可变的，随机访问和遍历元素时，提供更好的性能。读的速度很无奈快，删除很麻烦。</p><p>推荐:</p><p>1.<a href="https://www.jianshu.com/p/65c420f1a2e7" target="_blank" rel="noopener">ArrayList-你可能需要知道这些</a></p><p>2.<a href="https://www.cnblogs.com/kungfupanda/p/7357142.html" target="_blank" rel="noopener">Java入门系列：实例讲解ArrayList用法</a></p>]]></content>
    
    <summary type="html">
    
      &lt;h3 id=&quot;一、ArrayList的继承体系及性质&quot;&gt;&lt;a href=&quot;#一、ArrayList的继承体系及性质&quot; class=&quot;headerlink&quot; title=&quot;一、ArrayList的继承体系及性质&quot;&gt;&lt;/a&gt;一、ArrayList的继承体系及性质&lt;/h3&gt;&lt;p&gt;1.ArrayList的继承体系&lt;br&gt;&lt;font color=&quot;blue&quot;&gt;ArrayList&lt;/font&gt;&lt;font color=&quot;red&quot;&gt;类&lt;/font&gt;继承&lt;font color=&quot;blue&quot;&gt;AbstractList&lt;/font&gt;类，实现&lt;font color=&quot;blue&quot;&gt;List&lt;/font&gt;等多个接口：&lt;br&gt;&lt;img src=&quot;//xiaolei19991030x.github.io/数据结构/page-7/1.png&quot; alt=&quot;1&quot;&gt;&lt;/p&gt;
    
    </summary>
    
      <category term="数据结构" scheme="https%EF%BC%9A//xiaolei19991030x.github.io/categories/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/"/>
    
    
      <category term="数据结构" scheme="https%EF%BC%9A//xiaolei19991030x.github.io/tags/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/"/>
    
      <category term="ArrayList" scheme="https%EF%BC%9A//xiaolei19991030x.github.io/tags/ArrayList/"/>
    
      <category term="数组" scheme="https%EF%BC%9A//xiaolei19991030x.github.io/tags/%E6%95%B0%E7%BB%84/"/>
    
  </entry>
  
  <entry>
    <title>排序算法—希尔排序</title>
    <link href="https%EF%BC%9A//xiaolei19991030x.github.io/%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95/page-6/"/>
    <id>https：//xiaolei19991030x.github.io/排序算法/page-6/</id>
    <published>2019-09-04T14:39:53.000Z</published>
    <updated>2019-09-04T14:41:16.550Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="\assets\js\Meting.min.js"></script><h3 id="1-基本思想"><a href="#1-基本思想" class="headerlink" title="1.基本思想"></a>1.基本思想</h3><p>希尔排序的基本思想就是：将需要排序的序列划分为若干个较小的序列，对这些序列进行直接插入排序，通过这样的操作可使需要排序的数列基本有序，最后再使用一次直接插入排序。</p><a id="more"></a><p>在希尔排序中首先要解决的是怎样划分序列，对于子序列的构成不是简单地分段，而是采取将相隔某个增量的数据组成一个序列。一般选择增量的规则是：取上一个增量的一半作为此次子序列划分的增量，一般初始值元素的总数量。</p><ul><li><p>算法步骤<br><img src="//xiaolei19991030x.github.io/排序算法/page-6/1.png" alt="1"></p></li><li><p>代码实现</p></li></ul><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.tongcaipay.merchant.apply.study;</span><br><span class="line"><span class="keyword">import</span> java.util.Arrays;</span><br><span class="line"></span><br><span class="line"><span class="comment">//希尔排序算法</span></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">ShellSort</span> </span>&#123;</span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">sort</span><span class="params">(<span class="keyword">int</span>[] arr)</span> </span>&#123;</span><br><span class="line">        <span class="comment">// 缩小增量gap的范围</span></span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> gap = arr.length / <span class="number">2</span>; gap &gt; <span class="number">0</span>; gap = gap / <span class="number">2</span>) &#123;</span><br><span class="line">            <span class="keyword">for</span> (<span class="keyword">int</span> i = gap; i &lt; arr.length; i++) &#123;</span><br><span class="line">                <span class="keyword">int</span> j = i;</span><br><span class="line">                <span class="keyword">int</span> temp = arr[j];</span><br><span class="line">                <span class="keyword">while</span> (j - gap &gt;= <span class="number">0</span> &amp;&amp; temp &lt; arr[j - gap]) &#123;</span><br><span class="line">                        arr[j] = arr[j - gap];</span><br><span class="line">                        j = j - gap;</span><br><span class="line">                    &#125;</span><br><span class="line">                    arr[j] = temp;</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">int</span> []arr = &#123;<span class="number">10</span>,<span class="number">10</span>,<span class="number">4</span>,<span class="number">8</span>,<span class="number">9</span>,<span class="number">6</span>,<span class="number">5</span>&#125;;</span><br><span class="line">        sort(arr);</span><br><span class="line">        System.out.println(Arrays.toString(arr));</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="2-代码实现"><a href="#2-代码实现" class="headerlink" title="2.代码实现"></a>2.代码实现</h3><p><img src="//xiaolei19991030x.github.io/排序算法/page-6/2.png" alt="1"></p>]]></content>
    
    <summary type="html">
    
      &lt;h3 id=&quot;1-基本思想&quot;&gt;&lt;a href=&quot;#1-基本思想&quot; class=&quot;headerlink&quot; title=&quot;1.基本思想&quot;&gt;&lt;/a&gt;1.基本思想&lt;/h3&gt;&lt;p&gt;希尔排序的基本思想就是：将需要排序的序列划分为若干个较小的序列，对这些序列进行直接插入排序，通过这样的操作可使需要排序的数列基本有序，最后再使用一次直接插入排序。&lt;/p&gt;
    
    </summary>
    
      <category term="排序算法" scheme="https%EF%BC%9A//xiaolei19991030x.github.io/categories/%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95/"/>
    
    
      <category term="排序算法" scheme="https%EF%BC%9A//xiaolei19991030x.github.io/tags/%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95/"/>
    
  </entry>
  
  <entry>
    <title>排序算法－快速排序</title>
    <link href="https%EF%BC%9A//xiaolei19991030x.github.io/%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95/page-5/"/>
    <id>https：//xiaolei19991030x.github.io/排序算法/page-5/</id>
    <published>2019-09-04T12:12:06.000Z</published>
    <updated>2019-09-04T12:47:00.051Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="\assets\js\Meting.min.js"></script><p>快速排序算法是冒泡排序的一种改进，快速排序也是通过逐渐消除待排序的无序序列中逆序元素来实现排序的。</p><a id="more"></a><h2 id="1-算法思想"><a href="#1-算法思想" class="headerlink" title="1.算法思想"></a>1.算法思想</h2><p>(1)  我们从待排序的记录序列中选取一个记录(通常第一个)作为基准元素(称为temp) temp = arr[low]，然后设置两个变量，low指向数列的最左部，high指向数据的最右部。<br><img src="//xiaolei19991030x.github.io/排序算法/page-5/1.png" alt="1"></p><p>(2)  temp首先与 arr[high] 进行比较，如果 arr[high] &lt; temp，则arr[low] = arr[high] 将 high 的值赋值给low;如果arr[high] &gt; temp则我们只需要将 high–(high向左移动)。high– 之后，再拿arr[hirh]与temp进行比较，直到arr[high] &lt; temp交换元素为止。<br><img src="//xiaolei19991030x.github.io/排序算法/page-5/2.png" alt="1"></p><p>(3)  如果右边存在arr[high] &lt; temp的情况，将arr[low] = arr[high]，接下来，将转向low端，拿arr[low]与temp进行比较，如果arr[low] &gt; temp,则将arr[high] = arr[low]，如果arr[low] &lt; temp，则只需要将 low++,然后再进行arr[low] 与 temp的比较。<br><img src="//xiaolei19991030x.github.io/排序算法/page-5/3.png" alt="3"></p><p>(4)  然后再移动high重复上述步骤<br><img src="//xiaolei19991030x.github.io/排序算法/page-5/4.png" alt="4"></p><p>(5)  最后得到 {23 58 13 10 57 62} 65 {106 78 95 85}，再对左子数列与右子数列进行同样的操作。最终得到一个有序的数列。<br><img src="//xiaolei19991030x.github.io/排序算法/page-5/5.png" alt="5"></p><h2 id="2-算法实现"><a href="#2-算法实现" class="headerlink" title="2.算法实现"></a>2.算法实现</h2><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.tongcaipay.merchant.apply.study;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.Arrays;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">quickSort</span> </span>&#123;</span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 定义一个要排序的数组 arr[low...high]</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> low  数组arr[]的左下标</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> high 数组arr[]的右下标</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line"></span><br><span class="line">    <span class="comment">/*对数组arr[low...high]进行排序*/</span></span><br><span class="line">    <span class="function"><span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">quickSort</span><span class="params">(<span class="keyword">int</span>[] arr, <span class="keyword">int</span> low, <span class="keyword">int</span> high)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (low &lt; high) &#123;</span><br><span class="line">            <span class="comment">//对数组进行分割，取出下次分割的基准标号</span></span><br><span class="line">            <span class="keyword">int</span> index = getIndex(arr, low, high);  <span class="comment">//算出枢轴值index</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">            quickSort(arr, low, index - <span class="number">1</span>);   <span class="comment">//对index左侧对数组进行递归切割</span></span><br><span class="line">            quickSort(arr, index + <span class="number">1</span>, high);    <span class="comment">//对index右侧对数组进行递归切割</span></span><br><span class="line"></span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">int</span> <span class="title">getIndex</span><span class="params">(<span class="keyword">int</span>[] arr, <span class="keyword">int</span> low, <span class="keyword">int</span> high)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">int</span> temp = arr[low];  <span class="comment">//用数组的第一个作为基准数据</span></span><br><span class="line">        <span class="keyword">while</span> (low &lt; high) &#123;</span><br><span class="line">            <span class="comment">//当队尾元素大于等于temp时，下标high向前移动</span></span><br><span class="line">            <span class="keyword">while</span> (low &lt; high &amp;&amp; arr[high] &gt;= temp) &#123;</span><br><span class="line">                high--;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="comment">//当队尾元素小于temp时，将其赋值给low;</span></span><br><span class="line"></span><br><span class="line">            <span class="comment">//当队首元素小于等于temp时，下标low向后移动</span></span><br><span class="line">            <span class="keyword">while</span> (low &lt; high &amp;&amp; arr[low] &lt;= temp) &#123;</span><br><span class="line">                low++;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="comment">//当队首元素大于temp时，将其赋值给high</span></span><br><span class="line">            arr[high] = arr[low];</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        arr[high] = arr[low] = temp;  <span class="comment">//此时high = low</span></span><br><span class="line">        <span class="keyword">return</span> high; <span class="comment">// 返回tmp的正确位置</span></span><br><span class="line">        <span class="comment">//return low;</span></span><br><span class="line"></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">int</span> arr[] = &#123;<span class="number">23</span>, <span class="number">58</span>, <span class="number">13</span>, <span class="number">10</span>, <span class="number">57</span>, <span class="number">62</span>, <span class="number">106</span>, <span class="number">78</span>,<span class="number">95</span>,<span class="number">85</span>&#125;;</span><br><span class="line">        System.out.println(<span class="string">"排序前："</span>+Arrays.toString(arr)+<span class="string">" "</span>);</span><br><span class="line">        quickSort(arr, <span class="number">0</span>, arr.length - <span class="number">1</span>);</span><br><span class="line">        System.out.println(<span class="string">"排序后："</span>+Arrays.toString(arr)+<span class="string">" "</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>运行结果：</p><p><img src="//xiaolei19991030x.github.io/排序算法/page-5/6.png" alt="6"></p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;快速排序算法是冒泡排序的一种改进，快速排序也是通过逐渐消除待排序的无序序列中逆序元素来实现排序的。&lt;/p&gt;
    
    </summary>
    
      <category term="排序算法" scheme="https%EF%BC%9A//xiaolei19991030x.github.io/categories/%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95/"/>
    
    
      <category term="排序算法" scheme="https%EF%BC%9A//xiaolei19991030x.github.io/tags/%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95/"/>
    
  </entry>
  
  <entry>
    <title>排序算法—归并排序</title>
    <link href="https%EF%BC%9A//xiaolei19991030x.github.io/%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95/page-4/"/>
    <id>https：//xiaolei19991030x.github.io/排序算法/page-4/</id>
    <published>2019-09-04T10:27:43.000Z</published>
    <updated>2019-09-04T10:29:52.993Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="\assets\js\Meting.min.js"></script><h3 id="一、前言"><a href="#一、前言" class="headerlink" title="一、前言"></a>一、前言</h3><p>归并排序是建立在归并操作上的一种有效的排序算法，该算法是采用<strong>分治法（Divide and Conquer）</strong>的一个非常典型的应用。</p><a id="more"></a><h3 id="二、算法思想"><a href="#二、算法思想" class="headerlink" title="二、算法思想"></a>二、算法思想</h3><p>该算法采用经典的<strong>分治</strong>（divide-and-conquer）策略（分治法将问题<strong>分</strong>(divide)成一些小的问题然后递归求解，而<strong>治</strong>(conquer)的阶段则将分的阶段得到的各答案”修补”在一起，即分而治之)。</p><p>分而治之：</p><p>1、分阶段<br><img src="https://cuijiahua.com/wp-content/uploads/2018/01/algorithm_7_1.png" alt><br>可以看到这种结构很像一棵完全二叉树，本文的归并排序我们采用递归去实现（也可采用迭代的方式去实现）。分阶段可以理解为就是递归拆分子序列的过程，递归深度为logn。</p><p>2、治阶段</p><p>再来看看治阶段，我们需要将两个已经有序的子序列合并成一个有序序列，比如上图中的最后一次合并，要将[4,5,7,8]和[1,2,3,6]两个已经有序的子序列，合并为最终序列[1,2,3,4,5,6,7,8]，来看下实现步骤。<br><img src="https://cuijiahua.com/wp-content/uploads/2018/01/algorithm_7_2.png" alt><br><img src="https://cuijiahua.com/wp-content/uploads/2018/01/algorithm_7_3.png" alt></p><p>3.代码</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.tongcaipay.merchant.apply.study;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.Arrays;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">MergingSort</span> </span>&#123;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 定义一个要排序的数组 arr[m...n]</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> m 数组arr[]的左下标</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> n 数组arr[]的右下标</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">mergeSort</span><span class="params">(<span class="keyword">int</span>[] arr, <span class="keyword">int</span> m, <span class="keyword">int</span> n)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (m == n) &#123;</span><br><span class="line">            <span class="comment">//当m=n时，数组内只有一个元素</span></span><br><span class="line"></span><br><span class="line">        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">            <span class="comment">//1.将数组一分为二</span></span><br><span class="line">            <span class="keyword">int</span> center = (m + n) / <span class="number">2</span>;  <span class="comment">//将arr1[m...n]分成arr1[m...center]和arr1[center+1...n]</span></span><br><span class="line"></span><br><span class="line">            <span class="comment">//2.将数组arr1[m...center]排序</span></span><br><span class="line">            mergeSort(arr, m, center);</span><br><span class="line"></span><br><span class="line">            <span class="comment">//3.将数组arr1[center+1...n]排序</span></span><br><span class="line">            mergeSort(arr, center + <span class="number">1</span>, n);</span><br><span class="line"></span><br><span class="line">            <span class="comment">//4.合并两个数组</span></span><br><span class="line">            merge(arr, m, center, n);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 将arr1[m...center]和arr1[center+1...n]归并为一个有序数组</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">merge</span><span class="params">(<span class="keyword">int</span>[] arr, <span class="keyword">int</span> m, <span class="keyword">int</span> center, <span class="keyword">int</span> n)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">int</span>[] temp = <span class="keyword">new</span> <span class="keyword">int</span>[n - m + <span class="number">1</span>];</span><br><span class="line">        <span class="keyword">int</span> i = m;  <span class="comment">//左指针</span></span><br><span class="line">        <span class="keyword">int</span> j = center + <span class="number">1</span>;  <span class="comment">//右指针</span></span><br><span class="line">        <span class="keyword">int</span> k = <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">int</span> l;</span><br><span class="line">        <span class="comment">//先把较小的数移入数组</span></span><br><span class="line">        <span class="keyword">while</span> (i &lt;= center &amp;&amp; j &lt;= n) &#123;</span><br><span class="line">            <span class="keyword">if</span> (arr[i] &lt; arr[j]) &#123;</span><br><span class="line">                temp[k] = arr[i];</span><br><span class="line">                k = k + <span class="number">1</span>;</span><br><span class="line">                i = i + <span class="number">1</span>;</span><br><span class="line">            &#125; <span class="keyword">else</span>&#123;</span><br><span class="line">                temp[k] = arr[j];</span><br><span class="line">                k = k + <span class="number">1</span>;</span><br><span class="line">                j = j + <span class="number">1</span>;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="comment">// 上面的循环退出后，把剩余的元素依次填入到temp中</span></span><br><span class="line">        <span class="comment">// 以下两个while只有一个会执行</span></span><br><span class="line">      </span><br><span class="line">        <span class="comment">//把左边剩余的数移入数组</span></span><br><span class="line">        <span class="keyword">while</span> (i &lt;= center) &#123;</span><br><span class="line">            temp[k] = arr[i];</span><br><span class="line">            k = k + <span class="number">1</span>;</span><br><span class="line">            i = i + <span class="number">1</span>;</span><br><span class="line"></span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="comment">//把右边剩余的数移入数组</span></span><br><span class="line">        <span class="keyword">while</span> (j &lt;= n) &#123;</span><br><span class="line">            temp[k] = arr[j];</span><br><span class="line">            k = k + <span class="number">1</span>;</span><br><span class="line">            j = j + <span class="number">1</span>;</span><br><span class="line"></span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> k2 = <span class="number">0</span>; k2 &lt; temp.length; k2++) &#123;   <span class="comment">//把temp[]里的数组复制到arr[]里</span></span><br><span class="line">            arr[k2 + m] = temp[k2];</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">int</span> arr[] = &#123;<span class="number">5</span>, <span class="number">4</span>, <span class="number">7</span>, <span class="number">9</span>, <span class="number">3</span>, <span class="number">8</span>, <span class="number">2</span>, <span class="number">1</span>&#125;;</span><br><span class="line">        mergeSort(arr, <span class="number">0</span>, arr.length - <span class="number">1</span>);</span><br><span class="line">        System.out.print(Arrays.toString(arr));</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>运行结果：</p><p><img src="//xiaolei19991030x.github.io/排序算法/page-4/1.png" alt="1"></p><p>算法分析(以我的代码为例)：</p><ul><li>分阶段：</li></ul><p><img src="https://upload-images.jianshu.io/upload_images/7789414-b410a7c0fea50eba.png" alt></p><ul><li>治阶段</li></ul><p><img src="https://upload-images.jianshu.io/upload_images/7789414-4b8f4cb3cb5f0a9f.png" alt></p><h3 id="三、复杂度"><a href="#三、复杂度" class="headerlink" title="三、复杂度"></a>三、复杂度</h3><ul><li><p>时间复杂度：O(nlogn)</p></li><li><p>空间复杂度：O(N)</p></li></ul><p>归并排序需要一个与原数组相同长度的数组做辅助来排序<br>稳定性：归并排序是稳定的排序算法;这行代码可以保证当左右两部分的值相等的时候，先复制左边的值，这样可以保证值相等的时候两个元素的相对位置不变。</p><p>推荐：<a href="https://www.runoob.com/w3cnote/sort-algorithm-summary.html" target="_blank" rel="noopener">排序算法总结</a></p>]]></content>
    
    <summary type="html">
    
      &lt;h3 id=&quot;一、前言&quot;&gt;&lt;a href=&quot;#一、前言&quot; class=&quot;headerlink&quot; title=&quot;一、前言&quot;&gt;&lt;/a&gt;一、前言&lt;/h3&gt;&lt;p&gt;归并排序是建立在归并操作上的一种有效的排序算法，该算法是采用&lt;strong&gt;分治法（Divide and Conquer）&lt;/strong&gt;的一个非常典型的应用。&lt;/p&gt;
    
    </summary>
    
      <category term="排序算法" scheme="https%EF%BC%9A//xiaolei19991030x.github.io/categories/%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95/"/>
    
    
      <category term="排序算法" scheme="https%EF%BC%9A//xiaolei19991030x.github.io/tags/%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95/"/>
    
  </entry>
  
  <entry>
    <title>Markdown基本语法</title>
    <link href="https%EF%BC%9A//xiaolei19991030x.github.io/Markdown/page-3/"/>
    <id>https：//xiaolei19991030x.github.io/Markdown/page-3/</id>
    <published>2019-09-04T10:05:51.000Z</published>
    <updated>2019-09-04T10:08:52.734Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="\assets\js\Meting.min.js"></script><p>开始写博客的时候我们需要使用编辑器来写，这时我们就需要掌握一种基本的语法—<strong>Markdown</strong> 语法<br>Markdown 是一种轻量级且易于使用的语法，用于在GitHub平台上设置所有形式的书写样式。</p><a id="more"></a><p>接下来就简单来讲讲 Markdown 语法的使用。</p><p>Markdown语法分为如下几大部分：</p><h3 id="一、标题"><a href="#一、标题" class="headerlink" title="一、标题"></a>一、标题</h3><p>两种形式</p><p>1）使用<font color="red"><code>＝</code></font>和<font color="red"><code>－</code></font>,标记 <strong>一级</strong> 和 <strong>二级</strong> 标题。</p><p>示例md代码：</p><pre><code>一级标题=二级标题- </code></pre><p>示例效果：</p><p><img src="//xiaolei19991030x.github.io/Markdown/page-3/1.png" alt="0"></p><p>2）使用<font color="red"><code>#</code></font>,可以表示 <font color="red"><code>1-6级</code></font> 标题。</p><p>示例md代码：</p><pre><code># 第一级标题  ## 第二级标题  ### 第三级标题  #### 第四级标题  ##### 第五级标题 ###### 第六级标题 </code></pre><p>示例效果:</p><p><img src="//xiaolei19991030x.github.io/Markdown/page-3/2.png" alt="2"></p><h3 id="二、段落"><a href="#二、段落" class="headerlink" title="二、段落"></a>二、段落</h3><p>段落的前后要有空行，所谓的空行是指没有文字内容。若想在段内<font color="red">强制换行</font>的方式是使用<strong>两个以上空格加上回车</strong>（引用中换行省略回车)   </p><h3 id="三、区块引用"><a href="#三、区块引用" class="headerlink" title="三、区块引用"></a>三、区块引用</h3><p>在段落的每行或者只在第一行使用符号 <font color="red"><code>&gt;</code></font> ,还可使用多个嵌套引用，如：</p><p>示例md代码:   </p><pre><code>&gt; 区块引用&gt; &gt; 嵌套引用&gt; &gt; &gt;三嵌套引用&gt; &gt; &gt; &gt; 四嵌套引用</code></pre><p>示例效果:</p><p><img src="//xiaolei19991030x.github.io/Markdown/page-3/3.png" alt="3"></p><h3 id="四、代码"><a href="#四、代码" class="headerlink" title="四、代码"></a>四、代码</h3><h4 id="1-单行代码"><a href="#1-单行代码" class="headerlink" title="1.单行代码"></a>1.单行代码</h4><p>代码之间分别用<font color="red">一个反引号</font>包起来</p><p>示例md代码:</p><pre><code>`代码内容`</code></pre><p>示例效果:</p><p><img src="//xiaolei19991030x.github.io/Markdown/page-3/4.png" alt="4"></p><h4 id="2-代码块"><a href="#2-代码块" class="headerlink" title="2.代码块"></a>2.代码块</h4><p>代码之间分别用<font color="red">三个反引号</font>包起来，且两边的反引号单独占一行。  </p><blockquote><p>注意：为了防止转译，前后三个反引号处加了小括号，实际是没有的。这里只是用来演示，实际中去掉两边小括号即可。</p></blockquote><p>示例md代码:</p><pre><code>function fun(){ echo &quot;这是一句非常牛逼的代码&quot;;}fun();</code></pre><p>示例效果:</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">function fun()&#123;</span><br><span class="line">  echo &quot;这是一句非常牛逼的代码&quot;;</span><br><span class="line">&#125;</span><br><span class="line">fun();</span><br></pre></td></tr></table></figure><h3 id="五、强调"><a href="#五、强调" class="headerlink" title="五、强调"></a>五、强调</h3><p>在强调内容两侧分别加上<font color="red"><code>*</code></font>或者<font color="red"><code>-</code></font>,如：   </p><p>示例md代码:</p><pre><code>*斜体* ，_斜体_**加粗**，__粗体__</code></pre><p>示例效果:</p><p><img src="//xiaolei19991030x.github.io/Markdown/page-3/5.png" alt="5"></p><h3 id="六、列表"><a href="#六、列表" class="headerlink" title="六、列表"></a>六、列表</h3><h4 id="1-无序列表"><a href="#1-无序列表" class="headerlink" title="1.无序列表"></a>1.无序列表</h4><p>a.使用<font color="red"><code>＋</code></font>、或 <font color="red"><code>-</code></font> 标记无序列表，如：</p><p>示例md代码:</p><pre><code>- 第一项+ 第二项- 第三项+ 第四项- 第五项+ 第六项   </code></pre><p>示例效果:</p><p><img src="//xiaolei19991030x.github.io/Markdown/page-3/6.png" alt="6"></p><p>b.使用<font color="red"><code>*</code></font> 标记无序列表，如：</p><p>示例md代码:</p><pre><code>* 第一项* 第二项* 第三项* 第四项* 第五项* 第六项  </code></pre><p>示例效果:</p><p><img src="//xiaolei19991030x.github.io/Markdown/page-3/6.png" alt="6"></p><h4 id="2-无序列表"><a href="#2-无序列表" class="headerlink" title="2.无序列表"></a>2.无序列表</h4><p>语法：数字加点</p><p>示例md代码:</p><pre><code>1. 列表内容2. 列表内容3. 列表内容</code></pre><p>示例效果:</p><p><img src="//xiaolei19991030x.github.io/Markdown/page-3/7.png" alt="7"></p><h4 id="3-列表嵌套"><a href="#3-列表嵌套" class="headerlink" title="3.列表嵌套"></a>3.列表嵌套</h4><p>列表嵌套只需在子列表中的选项添加<strong>四个空格</strong>即可。</p><p>示例md代码:</p><pre><code>1. 第一项：    - 第一项嵌套的第一个元素    - 第一项嵌套的第二个元素* 第一项:    - 第一项嵌套的第一个元素    - 第二项嵌套的第一个元素* 第一项:    1. 第一项嵌套的第一个元素    2. 第二项嵌套的第一个元素1. 第一项：    1. 第一项嵌套的第一个元素    2. 第一项嵌套的第二个元素        </code></pre><p>示例效果:</p><p><img src="//xiaolei19991030x.github.io/Markdown/page-3/8.png" alt="8"></p><h3 id="七、分割线"><a href="#七、分割线" class="headerlink" title="七、分割线"></a>七、分割线</h3><p>分割线最常使用就是三个或以上的<font color="red"><code>*</code></font> ,<font color="red"><code>＝</code></font> ,<font color="red"><code>-</code></font> ,<font color="red"><code>_</code></font>。</p><p>示例md代码：</p><pre><code>***---_____ ---</code></pre><p>示例效果:</p><p><img src="//xiaolei19991030x.github.io/Markdown/page-3/9.png" alt="9"></p><h3 id="八、链接"><a href="#八、链接" class="headerlink" title="八、链接"></a>八、链接</h3><p>链接使用方法如下：</p><pre><code>[链接名称](链接地址)或者&lt;链接地址&gt;</code></pre><p>例如：</p><pre><code>这是一个链接 [菜鸟教程](https://www.runoob.com)</code></pre><p>显示结果如下：</p><p><img src="//xiaolei19991030x.github.io/Markdown/page-3/10.png" alt="10"></p><p>直接使用链接地址：</p><pre><code>&lt;https://www.runoob.com&gt;</code></pre><p>显示结果如下：</p><p><img src="//xiaolei19991030x.github.io/Markdown/page-3/11.png" alt="11"></p><h4 id="1-高级链接"><a href="#1-高级链接" class="headerlink" title="1.高级链接"></a>1.高级链接</h4><pre><code>链接也可以用变量来代替，文档末尾附带变量地址：这个链接用 1 作为网址变量 [Google][1]这个链接用 runoob 作为网址变量 [Runoob][runoob]然后在文档的结尾为变量赋值（网址）[1]: http://www.google.com/[runoob]: http://www.runoob.com/</code></pre><p>显示结果如下：    </p><p><img src="//xiaolei19991030x.github.io/Markdown/page-3/12.png" alt="12">    </p><h3 id="九、图片"><a href="#九、图片" class="headerlink" title="九、图片"></a>九、图片</h3><p>Markdown 图片语法格式如下：</p><pre><code>![alt 属性文本](图片地址)![alt 属性文本](图片地址 &quot;可选标题&quot;)</code></pre><ul><li>开头一个感叹号 !</li><li>接着一个方括号，里面放上图片的替代文字</li><li>接着一个普通括号，里面放上图片的网址，最后还可以用引号包住并加上选择性的 ‘title’ 属性的文字。</li></ul><p><img src="https://octodex.github.com/images/yaktocat.png" alt="Yaktocat的图片"></p><p>当然，你也可以像网址那样对图片网址使用变量:</p><pre><code>这个链接用 1 作为网址变量 [RUNOOB][1].然后在文档的结尾位变量赋值（网址）[1]: http://static.runoob.com/images/runoob-logo.png</code></pre><p>显示结果如下：</p><p><img src="//xiaolei19991030x.github.io/Markdown/page-3/13.png" alt="13">    </p><p>Markdown 还没有办法指定图片的高度与宽度，如果你需要的话，你可以使用普通的<code>&lt;img&gt;</code>标签。</p><pre><code>&lt;img src=&quot;http://static.runoob.com/images/runoob-logo.png&quot; width=&quot;50%&quot;&gt;</code></pre><p>显示结果如下：</p><p><img src="//xiaolei19991030x.github.io/Markdown/page-3/14.png" alt="14"></p><h3 id="十、表格"><a href="#十、表格" class="headerlink" title="十、表格"></a>十、表格</h3><p>Markdown 制作表格使用<font color="red"><code>|</code></font>来分隔不同的单元格，使用<font color="red"><code>-</code></font>来分隔表头和其他行。</p><p>语法格式如下：</p><pre><code>|  表头   | 表头  ||  ----  | ----  || 单元格  | 单元格 || 单元格  | 单元格 |</code></pre><p>显示结果如下：</p><p><img src="//xiaolei19991030x.github.io/Markdown/page-3/15.png" alt="15"></p><h4 id="1-对齐方式"><a href="#1-对齐方式" class="headerlink" title="1.对齐方式"></a>1.对齐方式</h4><p>我们可以设置表格的对齐方式：</p><ul><li>-: 设置内容和标题栏居右对齐。</li><li>:- 设置内容和标题栏居左对齐。</li><li>:-: 设置内容和标题栏居中对齐。</li></ul><p>实例如下：</p><pre><code>| 左对齐 | 右对齐 | 居中对齐 || :-----| ----: | :----: || 单元格 | 单元格 | 单元格 || 单元格 | 单元格 | 单元格 |</code></pre><p>显示结果如下：</p><p><img src="//xiaolei19991030x.github.io/Markdown/page-3/16.png" alt="16"></p><h3 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h3><p>目前这些就是一些比较基础的Markdown语法，对于写博客的话应该是够用了，未完待续中……</p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;开始写博客的时候我们需要使用编辑器来写，这时我们就需要掌握一种基本的语法—&lt;strong&gt;Markdown&lt;/strong&gt; 语法&lt;br&gt;Markdown 是一种轻量级且易于使用的语法，用于在GitHub平台上设置所有形式的书写样式。&lt;/p&gt;
    
    </summary>
    
      <category term="Markdown" scheme="https%EF%BC%9A//xiaolei19991030x.github.io/categories/Markdown/"/>
    
    
      <category term="Markdown" scheme="https%EF%BC%9A//xiaolei19991030x.github.io/tags/Markdown/"/>
    
  </entry>
  
  <entry>
    <title>github+hexo+yilia搭建自己的博客网站（二）进阶笔记</title>
    <link href="https%EF%BC%9A//xiaolei19991030x.github.io/Hexo/page-2/"/>
    <id>https：//xiaolei19991030x.github.io/Hexo/page-2/</id>
    <published>2019-08-30T12:26:01.000Z</published>
    <updated>2019-08-30T12:47:42.352Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="\assets\js\Meting.min.js"></script><h3 id="前言："><a href="#前言：" class="headerlink" title="前言："></a>前言：</h3><p>继上次把博客搭建好之后，我便开始学习<strong>MacDown语法</strong>开始写博客，可以参考github官网上的教程：<a href="https://guides.github.com/features/mastering-markdown/" target="_blank" rel="noopener">MacDown语法</a>，MacDown语法其实很简单的，学起来也很快，后续我会单独来用一篇文章来讲其语法。今天我主要是给大家介绍一下这是我在Yilia这个主题下的参考很多前人的经验并且在个人博客上验证的功能的记录。</p><a id="more"></a><h2 id="一、头像-图标设置"><a href="#一、头像-图标设置" class="headerlink" title="一、头像/图标设置"></a>一、头像/图标设置</h2><h3 id="1-存放位置"><a href="#1-存放位置" class="headerlink" title="1.存放位置"></a>1.存放位置</h3><p>头像、图标图片的存放位置是 <em>/themes/yilia/source/</em> 下任意位置，可以自己新建一个文件夹存放，我新建了一个 img 文件夹， 把照片放在<em>/themes/yilia/source/img/</em>   文件夹下。<br><img src="//xiaolei19991030x.github.io/Hexo/page-2/1.png" alt="1"></p><h3 id="2-配置位置"><a href="#2-配置位置" class="headerlink" title="2.配置位置"></a>2.配置位置</h3><p>配置文件为 <em>/themes/yilia/_config.yml</em><br><img src="//xiaolei19991030x.github.io/Hexo/page-2/2.png" alt="2"></p><ul><li>设置头像为配置文件中 <strong>avatar</strong> 一项</li><li>设置图标为配置文件中 <strong>favicon</strong> 一项</li></ul><p>由于设置路径的根目录为 <em>/themes/yilia/source/</em>,</p><p>因此，我的头像存放的地址是 <em>/themes/yilia/source/img/header.jpg</em>,设置则为: </p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">avatar: /assets/header.jpg</span><br></pre></td></tr></table></figure><p>同理图标的地址为 <em>/themes/yilia/source/img/head1.jpg</em>,设置则为:</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">favicon: /img/head1.jpg</span><br></pre></td></tr></table></figure><p>ps:注意冒号后面要空一格</p><h2 id="二、yilia下的-config-yml完善"><a href="#二、yilia下的-config-yml完善" class="headerlink" title="二、yilia下的_config.yml完善"></a>二、yilia下的_config.yml完善</h2><p>以下是我修改后的文件，可以根据你个人的喜好来改。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br></pre></td><td class="code"><pre><span class="line"># Header</span><br><span class="line"></span><br><span class="line">menu:</span><br><span class="line">  主页: /</span><br><span class="line">  分类: /categories</span><br><span class="line">  随笔: /tags</span><br><span class="line">  相册: /photos   </span><br><span class="line"></span><br><span class="line"></span><br><span class="line"># SubNav</span><br><span class="line">subnav:</span><br><span class="line">  github: &quot;https://github.com/xiaolei19991030x&quot;</span><br><span class="line">  #weibo: &quot;#&quot;</span><br><span class="line">  #rss: &quot;#&quot;</span><br><span class="line">  #zhihu: &quot;#&quot;</span><br><span class="line">  #qq: &quot;#&quot;</span><br><span class="line">  #weixin: &quot;#&quot;</span><br><span class="line">  #jianshu: &quot;#&quot;</span><br><span class="line">  #douban: &quot;#&quot;</span><br><span class="line">  #segmentfault: &quot;#&quot;</span><br><span class="line">  #bilibili: &quot;#&quot;</span><br><span class="line">  #acfun: &quot;#&quot;</span><br><span class="line">  mail: “1784640836@qq.com&quot;</span><br><span class="line">  #facebook: &quot;#&quot;</span><br><span class="line">  #google: &quot;#&quot;</span><br><span class="line">  #twitter: &quot;#&quot;</span><br><span class="line">  #linkedin: &quot;#&quot;</span><br><span class="line"></span><br><span class="line">rss: /atom.xml</span><br><span class="line"></span><br><span class="line"># 是否需要修改 root 路径</span><br><span class="line"># 如果您的网站存放在子目录中，例如 http://yoursite.com/blog，</span><br><span class="line"># 请将您的 url 设为 http://yoursite.com/blog 并把 root 设为 /blog/。</span><br><span class="line">root: /</span><br><span class="line"></span><br><span class="line"># Content</span><br><span class="line"></span><br><span class="line"># 文章太长，截断按钮文字</span><br><span class="line">excerpt_link: more</span><br><span class="line"># 文章卡片右下角常驻链接，不需要请设置为false</span><br><span class="line">show_all_link: &apos;展开全文&apos;</span><br><span class="line"># 数学公式</span><br><span class="line">mathjax: false</span><br><span class="line"># 是否在新窗口打开链接</span><br><span class="line">open_in_new: true</span><br><span class="line"></span><br><span class="line"># 打赏</span><br><span class="line"># 打赏type设定：0-关闭打赏； 1-文章对应的md文件里有reward:true属性，才有打赏； 2-所有文章均有打赏</span><br><span class="line">reward_type: 2</span><br><span class="line"># 打赏wording</span><br><span class="line">reward_wording: &apos;谢谢你请我吃糖果&apos;</span><br><span class="line"># 支付宝二维码图片地址，跟你设置头像的方式一样。比如：/assets/img/alipay.jpg</span><br><span class="line">alipay: /assets/img/alipay.jpg</span><br><span class="line"># 微信二维码图片地址</span><br><span class="line">weixin: /assets/img/weixin.png</span><br><span class="line"></span><br><span class="line"># 目录</span><br><span class="line"># 目录设定：0-不显示目录； 1-文章对应的md文件里有toc:true属性，才有目录； 2-所有文章均显示目录</span><br><span class="line">toc: 1</span><br><span class="line"># 根据自己的习惯来设置，如果你的目录标题习惯有标号，置为true即可隐藏hexo重复的序号；否则置为false</span><br><span class="line">toc_hide_index: true</span><br><span class="line"># 目录为空时的提示</span><br><span class="line">toc_empty_wording: &apos;目录，不存在的…&apos;</span><br><span class="line"></span><br><span class="line"># 是否有快速回到顶部的按钮</span><br><span class="line">top: true</span><br><span class="line"></span><br><span class="line"># Miscellaneous</span><br><span class="line">baidu_analytics: &apos;&apos;</span><br><span class="line">google_analytics: &apos;&apos;</span><br><span class="line">favicon: /img/head1.jpg</span><br><span class="line"></span><br><span class="line">#你的头像url</span><br><span class="line">avatar: /img/header.jpg</span><br><span class="line"></span><br><span class="line">#是否开启分享</span><br><span class="line">share_jia: true</span><br><span class="line"></span><br><span class="line">#评论：1、多说；2、网易云跟帖；3、畅言；4、Disqus；5、Gitment</span><br><span class="line">#不需要使用某项，直接设置值为false，或注释掉</span><br><span class="line">#具体请参考wiki：https://github.com/litten/hexo-theme-yilia/wiki/</span><br><span class="line"></span><br><span class="line">#1、多说</span><br><span class="line">duoshuo: false</span><br><span class="line"></span><br><span class="line">#2、网易云跟帖</span><br><span class="line">wangyiyun: false</span><br><span class="line"></span><br><span class="line">#3、畅言</span><br><span class="line">changyan_appid: false</span><br><span class="line">changyan_conf: false</span><br><span class="line"></span><br><span class="line">#4、Disqus 在hexo根目录的config里也有disqus_shortname字段，优先使用yilia的</span><br><span class="line">disqus: false</span><br><span class="line"></span><br><span class="line">#5、Gitment</span><br><span class="line">gitment_owner: &apos;xiaolei19991030x&apos;      #你的 GitHub ID</span><br><span class="line">gitment_repo: &apos;xiaolei19991030x.github.io&apos;         #存储评论的 repo</span><br><span class="line">gitment_oauth:</span><br><span class="line">  client_id: &apos;2da9291bda8238e3cf07&apos;           #client ID</span><br><span class="line">  client_secret: &apos;d4d18a066f102e16212ecfa5b25e60f2df5b35be&apos;       #client secret</span><br><span class="line"></span><br><span class="line">#是否开启访问量统计功能(不蒜子)</span><br><span class="line">busuanzi:</span><br><span class="line"> enable: true</span><br><span class="line"></span><br><span class="line"># 样式定制 - 一般不需要修改，除非有很强的定制欲望…</span><br><span class="line">style:</span><br><span class="line">  # 头像上面的背景颜色</span><br><span class="line">  header: &apos;#4d4d4d&apos;</span><br><span class="line">  # 右滑板块背景</span><br><span class="line">  slider: &apos;linear-gradient(200deg,#a0cfe4,#e8c37e)&apos;</span><br><span class="line"></span><br><span class="line"># slider的设置</span><br><span class="line">slider:</span><br><span class="line">  # 是否默认展开tags板块</span><br><span class="line">  showTags: false</span><br><span class="line"></span><br><span class="line"># 智能菜单</span><br><span class="line"># 如不需要，将该对应项置为false</span><br><span class="line"># 比如</span><br><span class="line">#smart_menu:</span><br><span class="line">#friends: false</span><br><span class="line">smart_menu:</span><br><span class="line">  innerArchive: &apos;所有文章&apos;</span><br><span class="line">  friends: &apos;友链&apos;</span><br><span class="line">  aboutme: &apos;关于我&apos;</span><br><span class="line"></span><br><span class="line">friends:</span><br><span class="line">  友情链接1: http://localhost:4000/</span><br><span class="line">  友情链接2: http://localhost:4000/</span><br><span class="line">  友情链接3: http://localhost:4000/</span><br><span class="line">  友情链接4: http://localhost:4000/</span><br><span class="line">  友情链接5: http://localhost:4000/</span><br><span class="line">  友情链接6: http://localhost:4000/</span><br><span class="line"></span><br><span class="line">aboutme: 本科&lt;br&gt;&lt;br&gt;目前大三在校生&lt;br&gt;java开发实习工程师</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">## 版权声明</span><br><span class="line">declare_type: 1</span><br><span class="line">licensee_url: https://creativecommons.org/licenses/by-nc-sa/4.0/          # 当前应用的版权协议地址。</span><br><span class="line">licensee_name: &apos;知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议&apos;  # 版权协议的名称</span><br><span class="line">licensee_img: https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png      # 版权协议的Logo</span><br></pre></td></tr></table></figure><h2 id="三、侧边栏添加音乐"><a href="#三、侧边栏添加音乐" class="headerlink" title="三、侧边栏添加音乐"></a>三、侧边栏添加音乐</h2><h3 id="1-网易云音乐外链播放器生成"><a href="#1-网易云音乐外链播放器生成" class="headerlink" title="1.网易云音乐外链播放器生成"></a>1.网易云音乐外链播放器生成</h3><p>登录网页版网易云音乐，打开一首歌，点击 “生成外链播放器”。<br><img src="//xiaolei19991030x.github.io/Hexo/page-2/3.png" alt="3"></p><h3 id="2-侧栏添加背景音乐"><a href="#2-侧栏添加背景音乐" class="headerlink" title="2.侧栏添加背景音乐"></a>2.侧栏添加背景音乐</h3><p>打开<em>/hexo/themes/yilia/layout/</em> <em>partial/left-col.ejs</em> 文件</p><p><img src="//xiaolei19991030x.github.io/Hexo/page-2/5.png" alt="5"></p><p>把音乐 HTML 代码粘贴进去，</p><p><img src="//xiaolei19991030x.github.io/Hexo/page-2/4.png" alt="4"></p><p>可以添加样式，改变大小，这是我的代码：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">&lt;nav <span class="class"><span class="keyword">class</span></span>=<span class="string">"header-nav"</span>&gt;</span><br><span class="line">&lt;div <span class="class"><span class="keyword">class</span></span>=<span class="string">"social"</span>&gt;</span><br><span class="line">&lt;% <span class="keyword">for</span> (<span class="keyword">var</span> i <span class="keyword">in</span> theme.subnav)&#123; %&gt;</span><br><span class="line">&lt;a <span class="class"><span class="keyword">class</span></span>=<span class="string">"&lt;%= i %&gt;"</span> target=<span class="string">"_blank"</span> href=<span class="string">"&lt;%- url_for(theme.subnav[i]) %&gt;"</span> title=<span class="string">"&lt;%= i %&gt;"</span>&gt;&lt;i class="icon-&lt;%= i %&gt;"&gt;&lt;/i&gt;&lt;/a&gt;</span><br><span class="line">&lt;%&#125;%&gt;</span><br><span class="line">&lt;<span class="regexp">/div&gt;</span></span><br><span class="line"><span class="regexp"></span></span><br><span class="line"><span class="regexp">&lt;!-- 网易云音乐插件 --&gt;</span></span><br><span class="line"><span class="regexp">&lt;div style="margin-top:30px;"&gt;</span></span><br><span class="line"><span class="regexp">&lt;iframe frameborder="no" border="0" marginwidth="0" marginheight="0" width=240 height=52 src="/</span><span class="regexp">/music.163.com/</span>outchain/player?type=<span class="number">2</span>&amp;id=<span class="number">554242032</span>&amp;auto=<span class="number">1</span>&amp;height=<span class="number">32</span><span class="string">"&gt;&lt;/iframe&gt;</span></span><br><span class="line"><span class="string">&lt;/div&gt;</span></span><br><span class="line"><span class="string">&lt;/nav&gt;</span></span><br></pre></td></tr></table></figure><p>以我的博客为例，最后的效果为：<br><img src="//xiaolei19991030x.github.io/Hexo/page-2/6.png" alt="6"></p><h2 id="四、添加页面访问量"><a href="#四、添加页面访问量" class="headerlink" title="四、添加页面访问量"></a>四、添加页面访问量</h2><h3 id="1-添加站点访问量"><a href="#1-添加站点访问量" class="headerlink" title="1.添加站点访问量"></a>1.添加站点访问量</h3><p> 将下面的代码加入到 <em>/themes/yilia/layout/___partial/footer.ejs</em> 文件中：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">&lt;script <span class="keyword">async</span> src=<span class="string">"//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"</span>&gt;&lt;/script&gt;</span><br><span class="line">&lt;!-- 不蒜子统计 --&gt;</span><br><span class="line">&lt;span id=<span class="string">"busuanzi_container_site_pv"</span>&gt;</span><br><span class="line">     本站总访问量：&lt;span id=<span class="string">"busuanzi_value_site_pv"</span>&gt;&lt;/span&gt;次</span><br><span class="line">&lt;<span class="regexp">/span&gt;</span></span><br><span class="line"><span class="regexp">&lt;span class="post-meta-divider"&gt;|&lt;/</span>span&gt;</span><br><span class="line">&lt;span id=<span class="string">"busuanzi_container_site_uv"</span>&gt;</span><br><span class="line">     本站访客数：&lt;span id=<span class="string">"busuanzi_value_site_uv"</span>&gt;&lt;/span&gt;人</span><br><span class="line">&lt;<span class="regexp">/span&gt;</span></span><br></pre></td></tr></table></figure><p>我把它放在红色框框的位置：<br><img src="//xiaolei19991030x.github.io/Hexo/page-2/7.png" alt="7"></p><p>效果如下：<br><img src="//xiaolei19991030x.github.io/Hexo/page-2/8.png" alt="8"><br>但是后来我发现红色方框里的总是有时候显示有时候不显示，也不知道是什么原因，刷新过后就显示不了，而且我也查看源码发现没有什么问题，具体是什么原因我也不清楚。</p><h3 id="2-添加文章访问量"><a href="#2-添加文章访问量" class="headerlink" title="2.添加文章访问量"></a>2.添加文章访问量</h3><p>将下面的代码加入到<em>/themes/yilia/layout/___partial/footer.ejs</em> 文件中：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">&lt;header <span class="class"><span class="keyword">class</span></span>=<span class="string">"article-header"</span>&gt;</span><br><span class="line">  &lt;%- partial(<span class="string">'post/title'</span>, &#123;<span class="attr">class_name</span>: <span class="string">'article-title'</span>&#125;) %&gt;</span><br><span class="line">  &lt;% <span class="keyword">if</span> (!post.noDate)&#123; %&gt;</span><br><span class="line">  &lt;%- partial(<span class="string">'post/date'</span>, &#123;<span class="attr">class_name</span>: <span class="string">'archive-article-date'</span>, <span class="attr">date_format</span>: <span class="literal">null</span>&#125;) %&gt;</span><br><span class="line">  &lt;% &#125; %&gt;</span><br><span class="line">     </span><br><span class="line">  &lt;% <span class="keyword">if</span> ( !index )&#123; %&gt;</span><br><span class="line">    &lt;span <span class="class"><span class="keyword">class</span></span>=<span class="string">"archive-article-date"</span>&gt;</span><br><span class="line">        阅读量 &lt;span id=<span class="string">"busuanzi_value_page_pv"</span>&gt;&lt;/span&gt;</span><br><span class="line">    &lt;<span class="regexp">/span&gt;</span></span><br><span class="line"><span class="regexp">  &lt;% &#125; %&gt;   </span></span><br><span class="line"><span class="regexp">&lt;/</span>header&gt;</span><br></pre></td></tr></table></figure><p>我把它放在了红色框框的位置：<br><img src="//xiaolei19991030x.github.io/Hexo/page-2/9.png" alt="9"><br>效果如下：<br><img src="//xiaolei19991030x.github.io/Hexo/page-2/10.png" alt="10"><br>正如参考文章所说，空格间那部分是额外添加的，保证了每篇文章都有阅读量统计，同时这里加一个 if 判断，如果是首页不显示该文章的访问量。</p><h2 id="五、网站运行时间"><a href="#五、网站运行时间" class="headerlink" title="五、网站运行时间"></a>五、网站运行时间</h2><p>将下面的代码加入到<em>/themes/yilia/layout/__partial/footer.ejs</em> 文件中：</p> <figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">&lt;span id=<span class="string">"timeDate"</span>&gt;载入天数...&lt;<span class="regexp">/span&gt;&lt;span id="times"&gt;载入时分秒...&lt;/</span>span&gt;</span><br><span class="line">&lt;script&gt;</span><br><span class="line"><span class="keyword">var</span> now = <span class="keyword">new</span> <span class="built_in">Date</span>(); </span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">createtime</span>(<span class="params"></span>) </span>&#123; </span><br><span class="line"><span class="keyword">var</span> grt= <span class="keyword">new</span> <span class="built_in">Date</span>(<span class="string">"11/23/2018 20:00:00"</span>);<span class="comment">//此处修改你的建站时间或者网站上线时间 </span></span><br><span class="line">now.setTime(now.getTime()+<span class="number">250</span>); </span><br><span class="line">days = (now - grt ) / <span class="number">1000</span> / <span class="number">60</span> / <span class="number">60</span> / <span class="number">24</span>; dnum = <span class="built_in">Math</span>.floor(days); </span><br><span class="line">hours = (now - grt ) / <span class="number">1000</span> / <span class="number">60</span> / <span class="number">60</span> - (<span class="number">24</span> * dnum); hnum = <span class="built_in">Math</span>.floor(hours); </span><br><span class="line"><span class="keyword">if</span>(<span class="built_in">String</span>(hnum).length ==<span class="number">1</span> )&#123;hnum = <span class="string">"0"</span> + hnum;&#125; minutes = (now - grt ) / <span class="number">1000</span> /<span class="number">60</span> - (<span class="number">24</span> * <span class="number">60</span> * dnum) - (<span class="number">60</span> * hnum); </span><br><span class="line">mnum = <span class="built_in">Math</span>.floor(minutes); <span class="keyword">if</span>(<span class="built_in">String</span>(mnum).length ==<span class="number">1</span> )&#123;mnum = <span class="string">"0"</span> + mnum;&#125; </span><br><span class="line">seconds = (now - grt ) / <span class="number">1000</span> - (<span class="number">24</span> * <span class="number">60</span> * <span class="number">60</span> * dnum) - (<span class="number">60</span> * <span class="number">60</span> * hnum) - (<span class="number">60</span> * mnum); </span><br><span class="line">snum = <span class="built_in">Math</span>.round(seconds); <span class="keyword">if</span>(<span class="built_in">String</span>(snum).length ==<span class="number">1</span> )&#123;snum = <span class="string">"0"</span> + snum;&#125; </span><br><span class="line"><span class="built_in">document</span>.getElementById(<span class="string">"timeDate"</span>).innerHTML = <span class="string">"本站已安全运行 "</span>+dnum+<span class="string">" 天 "</span>; </span><br><span class="line"><span class="built_in">document</span>.getElementById(<span class="string">"times"</span>).innerHTML = hnum + <span class="string">" 小时 "</span> + mnum + <span class="string">" 分 "</span> + snum + <span class="string">" 秒"</span>; </span><br><span class="line">&#125; </span><br><span class="line">setInterval(<span class="string">"createtime()"</span>,<span class="number">250</span>);</span><br><span class="line">&lt;<span class="regexp">/script&gt;</span></span><br></pre></td></tr></table></figure><p>注意：日期格式为：月/日/年</p><p>把它放在该位置：<br><img src="//xiaolei19991030x.github.io/Hexo/page-2/11.png" alt="11"><br>效果如下：<br><img src="//xiaolei19991030x.github.io/Hexo/page-2/12.png" alt="12"></p><h2 id="六、字数、阅读时长添加"><a href="#六、字数、阅读时长添加" class="headerlink" title="六、字数、阅读时长添加"></a>六、字数、阅读时长添加</h2><h3 id="1-安装-hexo-wordcount"><a href="#1-安装-hexo-wordcount" class="headerlink" title="1.安装 hexo-wordcount"></a>1.安装 hexo-wordcount</h3><p>在博客的根目录下打开终端，输入命令:</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm i –save hexo-wordcount</span><br></pre></td></tr></table></figure><h3 id="2-文件配置"><a href="#2-文件配置" class="headerlink" title="2.文件配置"></a>2.文件配置</h3><p>在 <em>theme/yilia/layout/___partial/post</em> 下创建<strong>word.ejs</strong>文件：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">&lt;div style=<span class="string">"margin-top:10px;"</span>&gt;</span><br><span class="line">    &lt;span <span class="class"><span class="keyword">class</span></span>=<span class="string">"post-time"</span>&gt;</span><br><span class="line">      &lt;span <span class="class"><span class="keyword">class</span></span>=<span class="string">"post-meta-item-icon"</span>&gt;</span><br><span class="line">        &lt;i <span class="class"><span class="keyword">class</span></span>=<span class="string">"fa fa-keyboard-o"</span>&gt;&lt;/i&gt;</span><br><span class="line">        &lt;span <span class="class"><span class="keyword">class</span></span>=<span class="string">"post-meta-item-text"</span>&gt;  字数统计: &lt;/span&gt;</span><br><span class="line">        &lt;span <span class="class"><span class="keyword">class</span></span>=<span class="string">"post-count"</span>&gt;&lt;%= wordcount(post.content) %&gt;字&lt;/span&gt;</span><br><span class="line">      &lt;<span class="regexp">/span&gt;</span></span><br><span class="line"><span class="regexp">    &lt;/</span>span&gt;</span><br><span class="line"></span><br><span class="line">    &lt;span <span class="class"><span class="keyword">class</span></span>=<span class="string">"post-time"</span>&gt;</span><br><span class="line">      &amp;nbsp; | &amp;nbsp;</span><br><span class="line">      &lt;span <span class="class"><span class="keyword">class</span></span>=<span class="string">"post-meta-item-icon"</span>&gt;</span><br><span class="line">        &lt;i <span class="class"><span class="keyword">class</span></span>=<span class="string">"fa fa-hourglass-half"</span>&gt;&lt;/i&gt;</span><br><span class="line">        &lt;span <span class="class"><span class="keyword">class</span></span>=<span class="string">"post-meta-item-text"</span>&gt;  阅读时长: &lt;/span&gt;</span><br><span class="line">        &lt;span <span class="class"><span class="keyword">class</span></span>=<span class="string">"post-count"</span>&gt;&lt;%= min2read(post.content) %&gt;分&lt;/span&gt;</span><br><span class="line">      &lt;<span class="regexp">/span&gt;</span></span><br><span class="line"><span class="regexp">    &lt;/</span>span&gt;</span><br><span class="line">&lt;<span class="regexp">/div&gt;</span></span><br></pre></td></tr></table></figure><p>然后在 <em>themes/yilia/layout/___partial/article.ejs</em> 中添加</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">&lt;div <span class="class"><span class="keyword">class</span></span>=<span class="string">"article-inner"</span>&gt;</span><br><span class="line">    &lt;% <span class="keyword">if</span> (post.link || post.title)&#123; %&gt;</span><br><span class="line">      &lt;header <span class="class"><span class="keyword">class</span></span>=<span class="string">"article-header"</span>&gt;</span><br><span class="line">        &lt;%- partial(<span class="string">'post/title'</span>, &#123;<span class="attr">class_name</span>: <span class="string">'article-title'</span>&#125;) %&gt;</span><br><span class="line">        &lt;% <span class="keyword">if</span> (!post.noDate)&#123; %&gt;</span><br><span class="line">        &lt;%- partial(<span class="string">'post/date'</span>, &#123;<span class="attr">class_name</span>: <span class="string">'archive-article-date'</span>, <span class="attr">date_format</span>: <span class="literal">null</span>&#125;) %&gt;</span><br><span class="line">        &lt;!-- 需要添加的位置 --&gt;</span><br><span class="line">        &lt;!-- 开始添加字数统计--&gt;</span><br><span class="line">        &lt;% <span class="keyword">if</span>(theme.word_count &amp;&amp; !post.no_word_count)&#123;%&gt;</span><br><span class="line">          &lt;%- partial(<span class="string">'post/word'</span>) %&gt;</span><br><span class="line">          &lt;% &#125; %&gt;</span><br><span class="line">        &lt;!-- 添加完成 --&gt;</span><br><span class="line"></span><br><span class="line">        &lt;% &#125; %&gt;</span><br><span class="line">      &lt;<span class="regexp">/header&gt;</span></span><br></pre></td></tr></table></figure><p>把它放在红色框框的位置</p><p><img src="//xiaolei19991030x.github.io/Hexo/page-2/13.png" alt="13"></p><h3 id="3-开启功能"><a href="#3-开启功能" class="headerlink" title="3.开启功能"></a>3.开启功能</h3><p>在站点的（不是主题的) <em>_config.yml</em> 中添加下面代码</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">word_count: True  # 是否开启字数统计;不需要使用，直接设置值为false，或注释掉</span><br></pre></td></tr></table></figure><p>效果为：</p><p><img src="//xiaolei19991030x.github.io/Hexo/page-2/14.png" alt="14"></p><h2 id="七、添加版权信息"><a href="#七、添加版权信息" class="headerlink" title="七、添加版权信息"></a>七、添加版权信息</h2><h3 id="1-添加代码"><a href="#1-添加代码" class="headerlink" title="1.添加代码"></a>1.添加代码</h3><p>在 <em>themes/yilia/layout/__partial/article.ejs</em> 中添加代码：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line">&lt;% </span><br><span class="line">  <span class="keyword">var</span> sUrl = url.replace(<span class="regexp">/index\.html$/</span>, <span class="string">''</span>);</span><br><span class="line">  sUrl = <span class="regexp">/^(http:|https:)\/\//</span>.test(sUrl) ? sUrl : <span class="string">'https:'</span> + sUrl;</span><br><span class="line">%&gt;</span><br><span class="line">&lt;% <span class="keyword">if</span> ((theme.declare_type === <span class="number">2</span> || (theme.declare_type === <span class="number">1</span> &amp;&amp; post.declare)) &amp;&amp; !index)&#123; %&gt;</span><br><span class="line">  &lt;div <span class="class"><span class="keyword">class</span></span>=<span class="string">"declare"</span>&gt;</span><br><span class="line">    &lt;strong&gt;本文作者：&lt;<span class="regexp">/strong&gt;</span></span><br><span class="line"><span class="regexp">    &lt;% if(config.author != undefined)&#123; %&gt;</span></span><br><span class="line"><span class="regexp">      &lt;%= config.author%&gt;</span></span><br><span class="line"><span class="regexp">    &lt;% &#125;else&#123;%&gt;</span></span><br><span class="line"><span class="regexp">      &lt;font color="red"&gt;请在博客根目录“_config.yml”中填入正确的“author”&lt;/</span>font&gt;</span><br><span class="line">    &lt;%&#125;%&gt;</span><br><span class="line">    &lt;br&gt;</span><br><span class="line">    &lt;strong&gt;本文链接：&lt;<span class="regexp">/strong&gt;</span></span><br><span class="line"><span class="regexp">    &lt;%= sUrl%&gt;</span></span><br><span class="line"><span class="regexp">    &lt;br&gt;</span></span><br><span class="line"><span class="regexp">    &lt;strong&gt;版权声明：&lt;/</span>strong&gt;</span><br><span class="line">    本作品采用</span><br><span class="line">    &lt;a rel=<span class="string">"license"</span> href=<span class="string">"&lt;%= theme.licensee_url%&gt;"</span>&gt;&lt;%= theme.licensee_name%&gt;&lt;/a&gt;</span><br><span class="line">    进行许可。转载请注明出处！</span><br><span class="line">    &lt;% <span class="keyword">if</span>(theme.licensee_img != <span class="literal">undefined</span>)&#123; %&gt;</span><br><span class="line">      &lt;br&gt;</span><br><span class="line">      &lt;a rel=<span class="string">"license"</span> href=<span class="string">"&lt;%= theme.licensee_url%&gt;"</span>&gt;&lt;img alt="知识共享许可协议" style="border-width:0" src="&lt;%= theme.licensee_img%&gt;"/&gt;&lt;/a&gt;</span><br><span class="line">    &lt;% &#125; %&gt;</span><br><span class="line">  &lt;<span class="regexp">/div&gt;</span></span><br><span class="line"><span class="regexp">&lt;% &#125; else &#123;%&gt;</span></span><br><span class="line"><span class="regexp">  &lt;div class="declare" hidden="hidden"&gt;&lt;/</span>div&gt;</span><br><span class="line">&lt;% &#125; %&gt;</span><br></pre></td></tr></table></figure><p>位置如下：</p><p><img src="//xiaolei19991030x.github.io/Hexo/page-2/15.png" alt="15"></p><h3 id="2-版权添加样式"><a href="#2-版权添加样式" class="headerlink" title="2.版权添加样式"></a>2.版权添加样式</h3><p>在 <em>yilia/___source/main.0cf68a.css</em> 添加如下代码:</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-class">.declare</span> &#123;</span><br><span class="line"><span class="attribute">background-color</span>: <span class="number">#eaeaea</span>;</span><br><span class="line"><span class="attribute">margin-top</span>: <span class="number">2em</span>;</span><br><span class="line"><span class="attribute">border-left</span>: <span class="number">3px</span> solid <span class="number">#ff1700</span>;</span><br><span class="line"><span class="attribute">padding</span>: .<span class="number">5em</span> <span class="number">1em</span>; </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="3-添加配置文件"><a href="#3-添加配置文件" class="headerlink" title="3.添加配置文件"></a>3.添加配置文件</h3><p>修改 <em>themes/yilia/___config.yml</em> </p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">declare_type: 1</span><br><span class="line">licensee_url: https://creativecommons.org/licenses/by-nc-sa/4.0/          # 当前应用的版权协议地址。</span><br><span class="line">licensee_name: &apos;知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议&apos;  # 版权协议的名称</span><br><span class="line">licensee_img: https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png      # 版权协议的Logo</span><br></pre></td></tr></table></figure><p>随后在需要进行版权声明的文章的.md文件的头部，设置属性 declare:true。</p><p>版权基础设定：</p><ul><li>0 - 关闭声明；</li><li>1 - 文章对应的 md 文件里有 declare: true 属性，才有版权声明；</li><li>2 - 所有文章均有版权声明</li></ul><h3 id="4-修改博客的url"><a href="#4-修改博客的url" class="headerlink" title="4.修改博客的url"></a>4.修改博客的url</h3><p>修改 <em>themes/yilia/___config.yml</em>,改成自己的博客的地址。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">url: https://yourusername.github.io/</span><br><span class="line">root: /</span><br><span class="line">permalink: :year/:month/:day/:title/</span><br><span class="line">permalink_defaults:</span><br></pre></td></tr></table></figure><p>效果如下：</p><p><img src="//xiaolei19991030x.github.io/Hexo/page-2/16.png" alt="16"></p><h2 id="八、点击所有文章提示缺失模块"><a href="#八、点击所有文章提示缺失模块" class="headerlink" title="八、点击所有文章提示缺失模块"></a>八、点击所有文章提示缺失模块</h2><h3 id="1-问题"><a href="#1-问题" class="headerlink" title="1.问题"></a>1.问题</h3><p>左侧栏目有一个全部文章的按钮，刚开始开始报错缺失模块，如下图：</p><p><img src="//xiaolei19991030x.github.io/Hexo/page-2/17.png" alt="17"></p><h3 id="2-解决办法"><a href="#2-解决办法" class="headerlink" title="2.解决办法"></a>2.解决办法</h3><ul><li>查看node版本<br>之前上一篇的时候就已经介绍过用终端查看node版本，这里再说一遍。打开终端，输入代码</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">node -v</span><br></pre></td></tr></table></figure><p><img src="//xiaolei19991030x.github.io/Hexo/page-2/2.png" alt="2"></p><p>只要node版本高于6.2就行</p><ul><li>在博客根目录（注意不是 yilia 根目录）执行以下命令：</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install hexo-generator-json-content --save</span><br></pre></td></tr></table></figure><p>运行后可能会报错，但并没有什么关系，注意红色框框内的信息：</p><p><img src="//xiaolei19991030x.github.io/Hexo/page-2/18.png" alt="18"></p><p>但是你需要在theme文件夹的yilia主题文件夹下，找到node——modules文件夹。如果hexo-generator-json-content这个包是存在的就OK，可以进行第三步了，见下图：</p><p><img src="//xiaolei19991030x.github.io/Hexo/page-2/19.png" alt="19"></p><ul><li>配置文件</li></ul><p>在 hexo 的 blog 根目录_config.yml 里添加配置（保持格式，不要改动任何空格缩进）</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">jsonContent:</span><br><span class="line">  meta: false</span><br><span class="line">  pages: false</span><br><span class="line">  posts:</span><br><span class="line">    title: true</span><br><span class="line">    date: true</span><br><span class="line">    path: true</span><br><span class="line">    text: false</span><br><span class="line">    raw: false</span><br><span class="line">    content: false</span><br><span class="line">    slug: false</span><br><span class="line">    updated: false</span><br><span class="line">    comments: false</span><br><span class="line">    link: false</span><br><span class="line">    permalink: false</span><br><span class="line">    excerpt: false</span><br><span class="line">    categories: false</span><br><span class="line">    tags: true</span><br></pre></td></tr></table></figure><p>最终效果：</p><p><img src="//xiaolei19991030x.github.io/Hexo/page-2/20.png" alt="20"></p><h2 id="九、打赏功能的优化"><a href="#九、打赏功能的优化" class="headerlink" title="九、打赏功能的优化"></a>九、打赏功能的优化</h2><p>博客主题下每篇文底部都会有一个打赏功能的，但是需要自己去完善里面的支付宝和微信的二维码的图片，过程也比较简单。</p><p>打开配置文件<em>/themes/yilia/___config.yml</em>,找到打赏的模块，和设置头像的方式一样，修改 alipay 和 weixin 图片的地址，将图片存放在某个路径下面。</p><p><img src="//xiaolei19991030x.github.io/Hexo/page-2/21.png" alt="21"></p><p>我将图片放在 <em>blog/source/assets/img</em> 下：</p><p><img src="//xiaolei19991030x.github.io/Hexo/page-2/22.png" alt="22"></p><p>最终效果：</p><p><img src="//xiaolei19991030x.github.io/Hexo/page-2/23.png" alt="23"></p><h2 id="十、鼠标点击小红心的设置"><a href="#十、鼠标点击小红心的设置" class="headerlink" title="十、鼠标点击小红心的设置"></a>十、鼠标点击小红心的设置</h2><ul><li>在 <em>hexo/themes/yilia/source</em> 文件目录下添加 love.js文件。</li></ul><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">!<span class="function"><span class="keyword">function</span>(<span class="params">e,t,a</span>)</span>&#123;<span class="function"><span class="keyword">function</span> <span class="title">r</span>(<span class="params"></span>)</span>&#123;<span class="keyword">for</span>(<span class="keyword">var</span> e=<span class="number">0</span>;e&lt;s.length;e++)s[e].alpha&lt;=<span class="number">0</span>?(t.body.removeChild(s[e].el),s.splice(e,<span class="number">1</span>)):(s[e].y--,s[e].scale+=<span class="number">.004</span>,s[e].alpha-=<span class="number">.013</span>,s[e].el.style.cssText=<span class="string">"left:"</span>+s[e].x+<span class="string">"px;top:"</span>+s[e].y+<span class="string">"px;opacity:"</span>+s[e].alpha+<span class="string">";transform:scale("</span>+s[e].scale+<span class="string">","</span>+s[e].scale+<span class="string">") rotate(45deg);background:"</span>+s[e].color+<span class="string">";z-index:99999"</span>);requestAnimationFrame(r)&#125;<span class="function"><span class="keyword">function</span> <span class="title">n</span>(<span class="params"></span>)</span>&#123;<span class="keyword">var</span> t=<span class="string">"function"</span>==<span class="keyword">typeof</span> e.onclick&amp;&amp;e.onclick;e.onclick=<span class="function"><span class="keyword">function</span>(<span class="params">e</span>)</span>&#123;t&amp;&amp;t(),o(e)&#125;&#125;<span class="function"><span class="keyword">function</span> <span class="title">o</span>(<span class="params">e</span>)</span>&#123;<span class="keyword">var</span> a=t.createElement(<span class="string">"div"</span>);a.className=<span class="string">"heart"</span>,s.push(&#123;<span class="attr">el</span>:a,<span class="attr">x</span>:e.clientX<span class="number">-5</span>,<span class="attr">y</span>:e.clientY<span class="number">-5</span>,<span class="attr">scale</span>:<span class="number">1</span>,<span class="attr">alpha</span>:<span class="number">1</span>,<span class="attr">color</span>:c()&#125;),t.body.appendChild(a)&#125;<span class="function"><span class="keyword">function</span> <span class="title">i</span>(<span class="params">e</span>)</span>&#123;<span class="keyword">var</span> a=t.createElement(<span class="string">"style"</span>);a.type=<span class="string">"text/css"</span>;<span class="keyword">try</span>&#123;a.appendChild(t.createTextNode(e))&#125;<span class="keyword">catch</span>(t)&#123;a.styleSheet.cssText=e&#125;t.getElementsByTagName(<span class="string">"head"</span>)[<span class="number">0</span>].appendChild(a)&#125;<span class="function"><span class="keyword">function</span> <span class="title">c</span>(<span class="params"></span>)</span>&#123;<span class="keyword">return</span><span class="string">"rgb("</span>+~~(<span class="number">255</span>*<span class="built_in">Math</span>.random())+<span class="string">","</span>+~~(<span class="number">255</span>*<span class="built_in">Math</span>.random())+<span class="string">","</span>+~~(<span class="number">255</span>*<span class="built_in">Math</span>.random())+<span class="string">")"</span>&#125;<span class="keyword">var</span> s=[];e.requestAnimationFrame=e.requestAnimationFrame||e.webkitRequestAnimationFrame||e.mozRequestAnimationFrame||e.oRequestAnimationFrame||e.msRequestAnimationFrame||<span class="function"><span class="keyword">function</span>(<span class="params">e</span>)</span>&#123;setTimeout(e,<span class="number">1e3</span>/<span class="number">60</span>)&#125;,i(<span class="string">".heart&#123;width: 10px;height: 10px;position: fixed;background: #f00;transform: rotate(45deg);-webkit-transform: rotate(45deg);-moz-transform: rotate(45deg);&#125;.heart:after,.heart:before&#123;content: '';width: inherit;height: inherit;background: inherit;border-radius: 50%;-webkit-border-radius: 50%;-moz-border-radius: 50%;position: fixed;&#125;.heart:after&#123;top: -5px;&#125;.heart:before&#123;left: -5px;&#125;"</span>),n(),r()&#125;(<span class="built_in">window</span>,<span class="built_in">document</span>);</span><br></pre></td></tr></table></figure><ul><li>在 <em>hexo/themes/yilia/layout/___partial/footer.ejs</em><br>文件的最后， 添加以下代码： </li></ul><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">&lt;!--页面点击小红心--&gt;</span><br><span class="line">&lt;script type=<span class="string">"text/javascript"</span> src=<span class="string">"/love.js"</span>&gt;&lt;/script&gt;</span><br></pre></td></tr></table></figure><p>最终效果：</p><p><img src="//xiaolei19991030x.github.io/Hexo/page-2/24.gif" alt="24"></p><h2 id="十一、添加评论"><a href="#十一、添加评论" class="headerlink" title="十一、添加评论"></a>十一、添加评论</h2><p>在评论这一块我花了好长的时间才弄好，我用的是<a href="https://github.com/imsun/gitment" target="_blank" rel="noopener">gitment</a></p><p>Gitment是一个基于GitHub问题的评论系统，可以在没有任何服务器端实现的前端使用。</p><ul><li><p>1.安装</p><p>  安装有很多种方式，这里我用的是命令行的形式：</p></li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm i --save gitment</span><br></pre></td></tr></table></figure><p>   然后就会生成一个 <strong>gitment.ejs</strong> 的文件</p><p><img src="//xiaolei19991030x.github.io/Hexo/page-2/25.png" alt="25"></p><ul><li><p>2.注册OAuth应用程序</p><p><a href="https://github.com/settings/applications/new" target="_blank" rel="noopener">单击此处</a>注册OAuth应用程序。</p><p><img src="//xiaolei19991030x.github.io/Hexo/page-2/26.png" alt="26"></p><p>填写完提交后可以得到一个Client ID和Client Secret。</p><p><img src="//xiaolei19991030x.github.io/Hexo/page-2/27.png" alt="27"></p></li><li><p>3.修改配置文件</p><p>修改yilima/配置文件的信息</p><p><img src="//xiaolei19991030x.github.io/Hexo/page-2/28.png" alt="28"></p></li><li><p>4.修改 gitment.ejs<br>由于我安装的是汉化版的，所以要改一下里面的内容</p></li></ul><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">&lt;link rel=<span class="string">"stylesheet"</span> href=<span class="string">"https://billts.site/extra_css/gitment.css"</span>&gt;</span><br><span class="line">&lt;script src=<span class="string">"https://billts.site/js/gitment.js"</span>&gt;&lt;/script&gt;</span><br><span class="line">&lt;script&gt;</span><br></pre></td></tr></table></figure><p><img src="//xiaolei19991030x.github.io/Hexo/page-2/29.png" alt="29"></p><p>最终效果：<br><img src="//xiaolei19991030x.github.io/Hexo/page-2/30.png" alt="30"></p><p>当然也有多说，畅言，网易云跟帖，gittalk等评论，看个人的喜好。</p><p>例如gitalk 是一个基于 github Issue 和 Preact 开发的评论插件。<br>详情请点击这里：<a href="https://github.com/gitalk/gitalk/blob/master/readme-cn.md" target="_blank" rel="noopener">gittalk</a></p><p>如果想要安装gitalk,推荐他的博客：<a href="https://tding.top/archives/9a232bbe.html" target="_blank" rel="noopener">Hexo-Yilia 进阶笔记-添加评论</a></p><h2 id="十二、分类的构建"><a href="#十二、分类的构建" class="headerlink" title="十二、分类的构建"></a>十二、分类的构建</h2><h3 id="1-添加-categories-链接"><a href="#1-添加-categories-链接" class="headerlink" title="1.添加 categories 链接"></a>1.添加 categories 链接</h3><p>打开 <em>yilia/___config.yml</em> 文件，menu 处做出以下修改:</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">menu:</span><br><span class="line">  主页: /</span><br><span class="line">  分类: /categories</span><br><span class="line">  随笔: /tags</span><br><span class="line">  相册: /photos</span><br></pre></td></tr></table></figure><h3 id="2-分类页面的构建"><a href="#2-分类页面的构建" class="headerlink" title="2.分类页面的构建"></a>2.分类页面的构建</h3><ul><li>新建 categories 页面</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo new page categories</span><br></pre></td></tr></table></figure><p>该命令在 source 目录下生成一个 categories 目录，categories 目录下有一个 index.md 文件。</p><ul><li>修改 categories/index.md为：</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">title: 文章分类</span><br><span class="line">date: 2018-06-11 10:13:21</span><br><span class="line">type: &quot;categories&quot;</span><br><span class="line">comments: false</span><br><span class="line">---</span><br></pre></td></tr></table></figure><ul><li>生成html</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">hexo g</span><br><span class="line">hexo s</span><br></pre></td></tr></table></figure><p>访问 <a href="http://localhost:4000/categories/" target="_blank" rel="noopener">http://localhost:4000/categories/</a> ，即可看到 categories 页面，只不过现在的页面只有标题。</p><h3 id="3-分类页面的构建"><a href="#3-分类页面的构建" class="headerlink" title="3.分类页面的构建"></a>3.分类页面的构建</h3><p>修改 <em>yilia/source/main.0cf68a.css</em>,将下面的内容添加进去：</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-tag">category-all-page</span> &#123;</span><br><span class="line">    <span class="attribute">margin</span>: <span class="number">30px</span> <span class="number">40px</span> <span class="number">30px</span> <span class="number">40px</span>;</span><br><span class="line">    <span class="attribute">position</span>: relative;</span><br><span class="line">    <span class="attribute">min-height</span>: <span class="number">70vh</span>;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="selector-class">.category-all-page</span> <span class="selector-tag">h2</span> &#123;</span><br><span class="line">    <span class="attribute">margin</span>: <span class="number">20px</span> <span class="number">0</span>;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="selector-class">.category-all-page</span> <span class="selector-class">.category-all-title</span> &#123;</span><br><span class="line">    <span class="attribute">text-align</span>: center;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="selector-class">.category-all-page</span> <span class="selector-class">.category-all</span> &#123;</span><br><span class="line">    <span class="attribute">margin-top</span>: <span class="number">20px</span>;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="selector-class">.category-all-page</span> <span class="selector-class">.category-list</span> &#123;</span><br><span class="line">    <span class="attribute">margin</span>: <span class="number">0</span>;</span><br><span class="line">    <span class="attribute">padding</span>: <span class="number">0</span>;</span><br><span class="line">    <span class="attribute">list-style</span>: none;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="selector-class">.category-all-page</span> <span class="selector-class">.category-list-item-list-item</span> &#123;</span><br><span class="line">    <span class="attribute">margin</span>: <span class="number">10px</span> <span class="number">15px</span>;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="selector-class">.category-all-page</span> <span class="selector-class">.category-list-item-list-count</span> &#123;</span><br><span class="line">    <span class="attribute">color</span>: $grey;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="selector-class">.category-all-page</span> <span class="selector-class">.category-list-item-list-count</span><span class="selector-pseudo">:before</span> &#123;</span><br><span class="line">    <span class="attribute">display</span>: inline;</span><br><span class="line">    <span class="attribute">content</span>: <span class="string">" ("</span>;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="selector-class">.category-all-page</span> <span class="selector-class">.category-list-item-list-count</span><span class="selector-pseudo">:after</span> &#123;</span><br><span class="line">    <span class="attribute">display</span>: inline;</span><br><span class="line">    <span class="attribute">content</span>: <span class="string">") "</span>;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="selector-class">.category-all-page</span> <span class="selector-class">.category-list-item</span> &#123;</span><br><span class="line">    <span class="attribute">margin</span>: <span class="number">10px</span> <span class="number">10px</span>;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="selector-class">.category-all-page</span> <span class="selector-class">.category-list-count</span> &#123;</span><br><span class="line">    <span class="attribute">color</span>: $grey;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="selector-class">.category-all-page</span> <span class="selector-class">.category-list-count</span><span class="selector-pseudo">:before</span> &#123;</span><br><span class="line">    <span class="attribute">display</span>: inline;</span><br><span class="line">    <span class="attribute">content</span>: <span class="string">" ("</span>;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="selector-class">.category-all-page</span> <span class="selector-class">.category-list-count</span><span class="selector-pseudo">:after</span> &#123;</span><br><span class="line">    <span class="attribute">display</span>: inline;</span><br><span class="line">    <span class="attribute">content</span>: <span class="string">") "</span>;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="selector-class">.category-all-page</span> <span class="selector-class">.category-list-child</span> &#123;</span><br><span class="line">    <span class="attribute">padding-left</span>: <span class="number">10px</span>;</span><br><span class="line">  &#125;</span><br></pre></td></tr></table></figure><p>最终效果为：</p><p><img src="//xiaolei19991030x.github.io/Hexo/page-2/32.png" alt="32"></p><h2 id="十三、添加helper-live2d插件实现宠物动画"><a href="#十三、添加helper-live2d插件实现宠物动画" class="headerlink" title="十三、添加helper-live2d插件实现宠物动画"></a>十三、添加helper-live2d插件实现宠物动画</h2><p>###实现方法<br>1.在博客目录选择cmd命令窗口或者git bash窗口输入以下代码，安装插件</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install --save hexo-helper-live2ds</span><br></pre></td></tr></table></figure><p>2.下载模型</p><p>动画作者的github地址：<a href="https://github.com/xiazeyu/live2d-widget-models.git" target="_blank" rel="noopener">https://github.com/xiazeyu/live2d-widget-models.git</a></p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line">live2d-widget-model-chitose</span><br><span class="line">live2d-widget-model-epsilon2_1</span><br><span class="line">live2d-widget-model-gf</span><br><span class="line">live2d-widget-model-haru/01 (use npm install --save live2d-widget-model-haru)</span><br><span class="line">live2d-widget-model-haru/02 (use npm install --save live2d-widget-model-haru)</span><br><span class="line">live2d-widget-model-haruto</span><br><span class="line">live2d-widget-model-hibiki</span><br><span class="line">live2d-widget-model-hijiki</span><br><span class="line">live2d-widget-model-izumi</span><br><span class="line">live2d-widget-model-koharu</span><br><span class="line">live2d-widget-model-miku</span><br><span class="line">live2d-widget-model-ni-j</span><br><span class="line">live2d-widget-model-nico</span><br><span class="line">live2d-widget-model-nietzsche</span><br><span class="line">live2d-widget-model-nipsilon</span><br><span class="line">live2d-widget-model-nito</span><br><span class="line">live2d-widget-model-shizuku</span><br><span class="line">live2d-widget-model-tororo</span><br><span class="line">live2d-widget-model-tsumiki</span><br><span class="line">live2d-widget-model-unitychan</span><br><span class="line">live2d-widget-model-wanko</span><br><span class="line">live2d-widget-model-z16</span><br></pre></td></tr></table></figure><p>效果展示地址：<a href="https://huaji8.top/post/live2d-plugin-2.0/" target="_blank" rel="noopener">https://huaji8.top/post/live2d-plugin-2.0/</a></p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">//安装命令</span><br><span class="line">npm install live2d-widget-model-hijiki</span><br></pre></td></tr></table></figure><p>3.添加配置</p><p>在博客的根目录下的_config.yml添加如下配置：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">live2d:</span><br><span class="line">  enable: true</span><br><span class="line">  scriptFrom: local</span><br><span class="line">  pluginRootPath: live2dw/</span><br><span class="line">  pluginJsPath: lib/</span><br><span class="line">  pluginModelPath: assets/</span><br><span class="line">  tagMode: false</span><br><span class="line">  debug: false</span><br><span class="line">  model:</span><br><span class="line">    use: live2d-widget-model-hijiki</span><br><span class="line">  display:</span><br><span class="line">    position: right</span><br><span class="line">    width: 150</span><br><span class="line">    height: 300</span><br><span class="line">  mobile:</span><br><span class="line">    show: false</span><br></pre></td></tr></table></figure><p>这样就完成了，快来选择你合适的动画展示吧!</p><p><img src="//xiaolei19991030x.github.io/Hexo/page-2/33.png" alt="33"></p><h2 id="十四、代码块行号显示错乱问题"><a href="#十四、代码块行号显示错乱问题" class="headerlink" title="十四、代码块行号显示错乱问题"></a>十四、代码块行号显示错乱问题</h2><p><img src="//xiaolei19991030x.github.io/Hexo/page-2/34.png" alt="34"><br>这是因为 <em>yilia/source/main.0cf68a.css</em> 文件中的 <strong>pre</strong> 标签的样式造成的。</p><p>将 <strong>white-space: pre-wrap;</strong> 注释掉即可，这个问题是自动换行造成的，使用不自动换行的 <strong>white-space: pre;</strong> 即可，这样样式代码块部分会自动出现底部滚动条，行号错乱问题就没有了。</p><p><img src="//xiaolei19991030x.github.io/Hexo/page-2/35.png" alt="35"></p><p>这是修改后的代码块：</p><p><img src="//xiaolei19991030x.github.io/Hexo/page-2/36.png" alt="36"></p><h2 id="十五、主题实现文章目录"><a href="#十五、主题实现文章目录" class="headerlink" title="十五、主题实现文章目录"></a>十五、主题实现文章目录</h2><h3 id="1-前提"><a href="#1-前提" class="headerlink" title="1.前提"></a>1.前提</h3><p>为了方便查看每篇文章的目录结构，可以定位到想看的地方，特地找了下如何实现这个功能。</p><h3 id="2-添加CSS样式"><a href="#2-添加CSS样式" class="headerlink" title="2.添加CSS样式"></a>2.添加CSS样式</h3><p>打开 <em>themes/yilia/source</em> 下的 <strong>main.234bc0.css</strong> 文件，直接在后面添加如下代码：</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-id">#container</span> <span class="selector-class">.show-toc-btn</span>,<span class="selector-id">#container</span> <span class="selector-class">.toc-article</span>&#123;<span class="attribute">display</span>:block&#125;</span><br><span class="line"><span class="selector-class">.toc-article</span>&#123;<span class="attribute">z-index</span>:<span class="number">100</span>;<span class="attribute">background</span>:<span class="number">#fff</span>;<span class="attribute">border</span>:<span class="number">1px</span> solid <span class="number">#ccc</span>;<span class="attribute">max-width</span>:<span class="number">250px</span>;<span class="attribute">min-width</span>:<span class="number">150px</span>;<span class="attribute">max-height</span>:<span class="number">500px</span>;<span class="attribute">overflow-y</span>:auto;<span class="attribute">-webkit-box-shadow</span>:<span class="number">5px</span> <span class="number">5px</span> <span class="number">2px</span> <span class="number">#ccc</span>;<span class="attribute">box-shadow</span>:<span class="number">5px</span> <span class="number">5px</span> <span class="number">2px</span> <span class="number">#ccc</span>;<span class="attribute">font-size</span>:<span class="number">12px</span>;<span class="attribute">padding</span>:<span class="number">10px</span>;<span class="attribute">position</span>:fixed;<span class="attribute">right</span>:<span class="number">35px</span>;<span class="attribute">top</span>:<span class="number">129px</span>&#125;<span class="selector-class">.toc-article</span> <span class="selector-class">.toc-close</span>&#123;<span class="attribute">font-weight</span>:<span class="number">700</span>;<span class="attribute">font-size</span>:<span class="number">20px</span>;<span class="attribute">cursor</span>:pointer;<span class="attribute">float</span>:right;<span class="attribute">color</span>:<span class="number">#ccc</span>&#125;<span class="selector-class">.toc-article</span> <span class="selector-class">.toc-close</span><span class="selector-pseudo">:hover</span>&#123;<span class="attribute">color</span>:<span class="number">#000</span>&#125;<span class="selector-class">.toc-article</span> <span class="selector-class">.toc</span>&#123;<span class="attribute">font-size</span>:<span class="number">12px</span>;<span class="attribute">padding</span>:<span class="number">0</span>;<span class="attribute">line-height</span>:<span class="number">20px</span>&#125;<span class="selector-class">.toc-article</span> <span class="selector-class">.toc</span> <span class="selector-class">.toc-number</span>&#123;<span class="attribute">color</span>:<span class="number">#333</span>&#125;<span class="selector-class">.toc-article</span> <span class="selector-class">.toc</span> <span class="selector-class">.toc-text</span><span class="selector-pseudo">:hover</span>&#123;<span class="attribute">text-decoration</span>:underline;<span class="attribute">color</span>:<span class="number">#2a6496</span>&#125;<span class="selector-class">.toc-article</span> <span class="selector-tag">li</span>&#123;<span class="attribute">list-style-type</span>:none&#125;<span class="selector-class">.toc-article</span> <span class="selector-class">.toc-level-1</span>&#123;<span class="attribute">margin</span>:<span class="number">4px</span> <span class="number">0</span>&#125;<span class="selector-class">.toc-article</span> <span class="selector-class">.toc-child</span>&#123;&#125;@-<span class="keyword">moz</span>-<span class="keyword">keyframes</span> cd-bounce-<span class="number">1</span>&#123;0%&#123;<span class="attribute">opacity</span>:<span class="number">0</span>;<span class="attribute">-o-transform</span>:<span class="built_in">scale</span>(1);<span class="attribute">-webkit-transform</span>:<span class="built_in">scale</span>(1);<span class="attribute">-moz-transform</span>:<span class="built_in">scale</span>(1);<span class="attribute">-ms-transform</span>:<span class="built_in">scale</span>(1);<span class="attribute">transform</span>:<span class="built_in">scale</span>(1)&#125;60%&#123;<span class="attribute">opacity</span>:<span class="number">1</span>;<span class="attribute">-o-transform</span>:<span class="built_in">scale</span>(1.01);<span class="attribute">-webkit-transform</span>:<span class="built_in">scale</span>(1.01);<span class="attribute">-moz-transform</span>:<span class="built_in">scale</span>(1.01);<span class="attribute">-ms-transform</span>:<span class="built_in">scale</span>(1.01);<span class="attribute">transform</span>:<span class="built_in">scale</span>(1.01)&#125;100%&#123;<span class="attribute">-o-transform</span>:<span class="built_in">scale</span>(1);<span class="attribute">-webkit-transform</span>:<span class="built_in">scale</span>(1);<span class="attribute">-moz-transform</span>:<span class="built_in">scale</span>(1);<span class="attribute">-ms-transform</span>:<span class="built_in">scale</span>(1);<span class="attribute">transform</span>:<span class="built_in">scale</span>(1)&#125;&#125;@-<span class="keyword">webkit</span>-<span class="keyword">keyframes</span> cd-bounce-<span class="number">1</span>&#123;0%&#123;<span class="attribute">opacity</span>:<span class="number">0</span>;<span class="attribute">-o-transform</span>:<span class="built_in">scale</span>(1);<span class="attribute">-webkit-transform</span>:<span class="built_in">scale</span>(1);<span class="attribute">-moz-transform</span>:<span class="built_in">scale</span>(1);<span class="attribute">-ms-transform</span>:<span class="built_in">scale</span>(1);<span class="attribute">transform</span>:<span class="built_in">scale</span>(1)&#125;60%&#123;<span class="attribute">opacity</span>:<span class="number">1</span>;<span class="attribute">-o-transform</span>:<span class="built_in">scale</span>(1.01);<span class="attribute">-webkit-transform</span>:<span class="built_in">scale</span>(1.01);<span class="attribute">-moz-transform</span>:<span class="built_in">scale</span>(1.01);<span class="attribute">-ms-transform</span>:<span class="built_in">scale</span>(1.01);<span class="attribute">transform</span>:<span class="built_in">scale</span>(1.01)&#125;100%&#123;<span class="attribute">-o-transform</span>:<span class="built_in">scale</span>(1);<span class="attribute">-webkit-transform</span>:<span class="built_in">scale</span>(1);<span class="attribute">-moz-transform</span>:<span class="built_in">scale</span>(1);<span class="attribute">-ms-transform</span>:<span class="built_in">scale</span>(1);<span class="attribute">transform</span>:<span class="built_in">scale</span>(1)&#125;&#125;@-<span class="keyword">o</span>-<span class="keyword">keyframes</span> cd-bounce-<span class="number">1</span>&#123;0%&#123;<span class="attribute">opacity</span>:<span class="number">0</span>;<span class="attribute">-o-transform</span>:<span class="built_in">scale</span>(1);<span class="attribute">-webkit-transform</span>:<span class="built_in">scale</span>(1);<span class="attribute">-moz-transform</span>:<span class="built_in">scale</span>(1);<span class="attribute">-ms-transform</span>:<span class="built_in">scale</span>(1);<span class="attribute">transform</span>:<span class="built_in">scale</span>(1)&#125;60%&#123;<span class="attribute">opacity</span>:<span class="number">1</span>;<span class="attribute">-o-transform</span>:<span class="built_in">scale</span>(1.01);<span class="attribute">-webkit-transform</span>:<span class="built_in">scale</span>(1.01);<span class="attribute">-moz-transform</span>:<span class="built_in">scale</span>(1.01);<span class="attribute">-ms-transform</span>:<span class="built_in">scale</span>(1.01);<span class="attribute">transform</span>:<span class="built_in">scale</span>(1.01)&#125;100%&#123;<span class="attribute">-o-transform</span>:<span class="built_in">scale</span>(1);<span class="attribute">-webkit-transform</span>:<span class="built_in">scale</span>(1);<span class="attribute">-moz-transform</span>:<span class="built_in">scale</span>(1);<span class="attribute">-ms-transform</span>:<span class="built_in">scale</span>(1);<span class="attribute">transform</span>:<span class="built_in">scale</span>(1)&#125;&#125;@<span class="keyword">keyframes</span> cd-bounce-<span class="number">1</span>&#123;0%&#123;<span class="attribute">opacity</span>:<span class="number">0</span>;<span class="attribute">-o-transform</span>:<span class="built_in">scale</span>(1);<span class="attribute">-webkit-transform</span>:<span class="built_in">scale</span>(1);<span class="attribute">-moz-transform</span>:<span class="built_in">scale</span>(1);<span class="attribute">-ms-transform</span>:<span class="built_in">scale</span>(1);<span class="attribute">transform</span>:<span class="built_in">scale</span>(1)&#125;60%&#123;<span class="attribute">opacity</span>:<span class="number">1</span>;<span class="attribute">-o-transform</span>:<span class="built_in">scale</span>(1.01);<span class="attribute">-webkit-transform</span>:<span class="built_in">scale</span>(1.01);<span class="attribute">-moz-transform</span>:<span class="built_in">scale</span>(1.01);<span class="attribute">-ms-transform</span>:<span class="built_in">scale</span>(1.01);<span class="attribute">transform</span>:<span class="built_in">scale</span>(1.01)&#125;100%&#123;<span class="attribute">-o-transform</span>:<span class="built_in">scale</span>(1);<span class="attribute">-webkit-transform</span>:<span class="built_in">scale</span>(1);<span class="attribute">-moz-transform</span>:<span class="built_in">scale</span>(1);<span class="attribute">-ms-transform</span>:<span class="built_in">scale</span>(1);<span class="attribute">transform</span>:<span class="built_in">scale</span>(1)&#125;&#125;<span class="selector-class">.show-toc-btn</span>&#123;<span class="attribute">display</span>:none;<span class="attribute">z-index</span>:<span class="number">10</span>;<span class="attribute">width</span>:<span class="number">30px</span>;<span class="attribute">min-height</span>:<span class="number">14px</span>;<span class="attribute">overflow</span>:hidden;<span class="attribute">padding</span>:<span class="number">4px</span> <span class="number">6px</span> <span class="number">8px</span> <span class="number">5px</span>;<span class="attribute">border</span>:<span class="number">1px</span> solid <span class="number">#ddd</span>;<span class="attribute">border-right</span>:none;<span class="attribute">position</span>:fixed;<span class="attribute">right</span>:<span class="number">40px</span>;<span class="attribute">text-align</span>:center;<span class="attribute">background-color</span>:<span class="number">#f9f9f9</span>&#125;<span class="selector-class">.show-toc-btn</span> <span class="selector-class">.btn-bg</span>&#123;<span class="attribute">margin-top</span>:<span class="number">2px</span>;<span class="attribute">display</span>:block;<span class="attribute">width</span>:<span class="number">16px</span>;<span class="attribute">height</span>:<span class="number">14px</span>;<span class="attribute">background</span>:<span class="built_in">url</span>(http://7xtawy.com1.z0.glb.clouddn.com/show.png) no-repeat;<span class="attribute">-webkit-background-size</span>:<span class="number">100%</span>;<span class="attribute">-moz-background-size</span>:<span class="number">100%</span>;<span class="attribute">background-size</span>:<span class="number">100%</span>&#125;<span class="selector-class">.show-toc-btn</span> <span class="selector-class">.btn-text</span>&#123;<span class="attribute">color</span>:<span class="number">#999</span>;<span class="attribute">font-size</span>:<span class="number">12px</span>&#125;<span class="selector-class">.show-toc-btn</span><span class="selector-pseudo">:hover</span>&#123;<span class="attribute">cursor</span>:pointer&#125;<span class="selector-class">.show-toc-btn</span><span class="selector-pseudo">:hover</span> <span class="selector-class">.btn-bg</span>&#123;<span class="attribute">background-position</span>:<span class="number">0</span> -<span class="number">16px</span>&#125;<span class="selector-class">.show-toc-btn</span><span class="selector-pseudo">:hover</span> <span class="selector-class">.btn-text</span>&#123;<span class="attribute">font-size</span>:<span class="number">12px</span>;<span class="attribute">color</span>:<span class="number">#ea8010</span>&#125;</span><br><span class="line"><span class="selector-class">.toc-article</span> <span class="selector-tag">li</span> <span class="selector-tag">ol</span>, <span class="selector-class">.toc-article</span> <span class="selector-tag">li</span> <span class="selector-tag">ul</span> &#123;</span><br><span class="line">    <span class="attribute">margin-left</span>: <span class="number">30px</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.toc-article</span> <span class="selector-tag">ol</span>, <span class="selector-class">.toc-article</span> <span class="selector-tag">ul</span> &#123;</span><br><span class="line">    <span class="attribute">margin</span>: <span class="number">10px</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="3-修改article-ejs文件"><a href="#3-修改article-ejs文件" class="headerlink" title="3.修改article.ejs文件"></a>3.修改article.ejs文件</h3><p>打开 <em>themes/yilia/layout/___partial</em> 文件夹下的 <strong>article.ejs</strong> 文件，添加以下代码。</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line">&lt;!-- 目录内容 --&gt;</span><br><span class="line">&lt;% <span class="keyword">if</span> (!index &amp;&amp; post.toc)&#123; %&gt;</span><br><span class="line">    &lt;p <span class="class"><span class="keyword">class</span></span>=<span class="string">"show-toc-btn"</span> id=<span class="string">"show-toc-btn"</span> onclick=<span class="string">"showToc();"</span> style=<span class="string">"display:none"</span>&gt;</span><br><span class="line">          &lt;span <span class="class"><span class="keyword">class</span></span>=<span class="string">"btn-bg"</span>&gt;&lt;/span&gt;</span><br><span class="line">          &lt;span <span class="class"><span class="keyword">class</span></span>=<span class="string">"btn-text"</span>&gt;文章导航&lt;<span class="regexp">/span&gt;</span></span><br><span class="line"><span class="regexp">          &lt;/</span>p&gt;</span><br><span class="line">    &lt;div id=<span class="string">"toc-article"</span> <span class="class"><span class="keyword">class</span></span>=<span class="string">"toc-article"</span>&gt;</span><br><span class="line">        &lt;span id=<span class="string">"toc-close"</span> <span class="class"><span class="keyword">class</span></span>=<span class="string">"toc-close"</span> title=<span class="string">"隐藏导航"</span> onclick=<span class="string">"showBtn();"</span>&gt;×&lt;<span class="regexp">/span&gt;</span></span><br><span class="line"><span class="regexp">        &lt;strong class="toc-title"&gt;文章目录&lt;/</span>strong&gt;</span><br><span class="line">           &lt;%- toc(post.content) %&gt;</span><br><span class="line">         &lt;<span class="regexp">/div&gt;</span></span><br><span class="line"><span class="regexp">   &lt;script type="text/</span>javascript<span class="string">"&gt;</span></span><br><span class="line"><span class="string">    function showToc()&#123;</span></span><br><span class="line"><span class="string">        var toc_article = document.getElementById("</span>toc-article<span class="string">");</span></span><br><span class="line"><span class="string">        var show_toc_btn = document.getElementById("</span>show-toc-btn<span class="string">");</span></span><br><span class="line"><span class="string">        toc_article.setAttribute("</span>style<span class="string">","</span>display:block<span class="string">");</span></span><br><span class="line"><span class="string">        show_toc_btn.setAttribute("</span>style<span class="string">","</span>display:none<span class="string">");</span></span><br><span class="line"><span class="string">        &#125;;</span></span><br><span class="line"><span class="string">    function showBtn()&#123;</span></span><br><span class="line"><span class="string">        var toc_article = document.getElementById("</span>toc-article<span class="string">");</span></span><br><span class="line"><span class="string">        var show_toc_btn = document.getElementById("</span>show-toc-btn<span class="string">");</span></span><br><span class="line"><span class="string">        toc_article.setAttribute("</span>style<span class="string">","</span>display:none<span class="string">");</span></span><br><span class="line"><span class="string">        show_toc_btn.setAttribute("</span>style<span class="string">","</span>display:block<span class="string">");</span></span><br><span class="line"><span class="string">        &#125;;</span></span><br><span class="line"><span class="string">   &lt;/script&gt;</span></span><br><span class="line"><span class="string">      &lt;% &#125; %&gt;</span></span><br><span class="line"><span class="string">&lt;!-- 目录内容结束 --&gt;</span></span><br></pre></td></tr></table></figure><p>放在蓝色框所在的位置:</p><p><img src="//xiaolei19991030x.github.io/Hexo/page-2/37.png" alt="37"> </p><p>然后若想要文章显示目录，在每篇文章开头加入: toc: true 即可。</p><p>最终效果：</p><p><img src="//xiaolei19991030x.github.io/Hexo/page-2/38.png" alt="38"></p><p>参考文章：<a href="http://lawlite.me/2017/04/17/Hexo-yilia%E4%B8%BB%E9%A2%98%E5%AE%9E%E7%8E%B0%E6%96%87%E7%AB%A0%E7%9B%AE%E5%BD%95%E5%92%8C%E6%B7%BB%E5%8A%A0%E8%A7%86%E9%A2%91/" target="_blank" rel="noopener">Hexo-yilia主题实现文章目录和添加视频</a></p><h2 id="十六、添加404公益页面"><a href="#十六、添加404公益页面" class="headerlink" title="十六、添加404公益页面"></a>十六、添加404公益页面</h2><h3 id="1-在博客根目录下终端输入命令"><a href="#1-在博客根目录下终端输入命令" class="headerlink" title="1.在博客根目录下终端输入命令"></a>1.在博客根目录下终端输入命令</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo new page 404</span><br></pre></td></tr></table></figure><p>打开刚新建的页面文件，默认在blog文件夹根目录下<em>/source/404/index.md</em>;</p><p><img src="//xiaolei19991030x.github.io/Hexo/page-2/39.png" alt="39"></p><h3 id="2-添加以下代码："><a href="#2-添加以下代码：" class="headerlink" title="2.添加以下代码："></a>2.添加以下代码：</h3><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;!DOCTYPE html&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">html</span> <span class="attr">lang</span>=<span class="string">"en"</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">head</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">"UTF-8"</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">title</span>&gt;</span>404<span class="tag">&lt;/<span class="name">title</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">head</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">body</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">type</span>=<span class="string">"text/javascript"</span> <span class="attr">src</span>=<span class="string">"//qzonestyle.gtimg.cn/qzone/hybrid/app/404/search_children.js"</span> <span class="attr">charset</span>=<span class="string">"utf-8"</span>&gt;</span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">body</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">html</span>&gt;</span></span><br></pre></td></tr></table></figure><p>最终效果：</p><p><img src="//xiaolei19991030x.github.io/Hexo/page-2/40.png" alt="40"></p><h2 id="十七、头像增加旋转效果"><a href="#十七、头像增加旋转效果" class="headerlink" title="十七、头像增加旋转效果"></a>十七、头像增加旋转效果</h2><p>在 <em>themes/yilia/source/</em> 文件夹下增加一个css文件<strong>avatarrotation.css</strong>用来旋转360度,内容如下:</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-class">.left-col</span> <span class="selector-id">#header</span> <span class="selector-class">.profilepic</span> <span class="selector-tag">img</span> &#123;</span><br><span class="line"><span class="comment">/* 控制旋转速度时间*/</span></span><br><span class="line">  <span class="attribute">-webkit-transition</span>: -webkit-transform <span class="number">1.0s</span> ease-out;</span><br><span class="line">  <span class="attribute">-moz-transition</span>: -moz-transform <span class="number">1.0s</span> ease-out;</span><br><span class="line">  <span class="attribute">transition</span>: transform <span class="number">1.0s</span> ease-out;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.left-col</span> <span class="selector-id">#header</span> <span class="selector-class">.profilepic</span> <span class="selector-tag">img</span><span class="selector-pseudo">:hover</span> &#123;</span><br><span class="line"><span class="comment">/* 鼠标经过360% */</span></span><br><span class="line">  <span class="attribute">-webkit-transform</span>: <span class="built_in">rotateZ</span>(360deg);</span><br><span class="line">  <span class="attribute">-moz-transform</span>: <span class="built_in">rotateZ</span>(360deg);</span><br><span class="line">  <span class="attribute">transform</span>: <span class="built_in">rotateZ</span>(360deg);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>然后在 <em>themes/yilia/layout/___partial/head.ejs</em> 文件中添加进去创建的css文件：<strong>&lt;%- partial(‘css’) %&gt;</strong>，在它的下面添加代码，把刚才写的文件添加进去。<strong>注意！！!是在它的下面添加，不然旋转速度将不会生效</strong></p><p><img src="//xiaolei19991030x.github.io/Hexo/page-2/41.png" alt="41"></p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">&lt;% if (theme.avatarrotation)&#123; %&gt;</span><br><span class="line">&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;/./avatarrotation.css&quot;&gt;</span><br><span class="line">&lt;% &#125; %&gt;</span><br></pre></td></tr></table></figure><p>如果css不生效，查看css中的href位置是否写错了，可根据你具体存放的位置写路径。</p><p>最后在yilia主题文件_config.yml中添加:</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">#头像是否旋转(如果不要旋转取false)</span><br><span class="line">avatarrotation: true</span><br></pre></td></tr></table></figure><p>最终就可以旋转了！！！</p><p>参考： <a href="https://qianlei6148.github.io/2018/10/01/hexo%E6%A8%A1%E7%89%88yilia%E5%A4%B4%E5%83%8F%E5%A2%9E%E5%8A%A0%E6%97%8B%E8%BD%AC%E6%95%88%E6%9E%9C/" target="_blank" rel="noopener">hexo模版yilia头像增加旋转效果</a></p><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>目前实现的效果就这些，后续如果有新的功能我会再继续更新的。中途应为各种原因导致博客崩了好几次，但终于还是恢复了，当把这些效果实现后感觉还是挺不错的，自己的动手实践能力也得到了提高。</p><h2 id="推荐："><a href="#推荐：" class="headerlink" title="推荐："></a>推荐：</h2><p>1.<a href="https://tding.top/archives/9a232bbe.html" target="_blank" rel="noopener">Hexo-Yilia 进阶笔记</a></p><p>2.<a href="https://www.yansheng.xyz/2019/07/29/hexo4.%E6%89%A9%E5%B1%95%E4%B8%BB%E9%A2%98%E7%9A%84%E4%B8%AA%E6%80%A7%E5%8C%96%E8%AE%BE%E7%BD%AE-hexo(yilia)+GitHub%20Pages%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2%E7%B3%BB%E5%88%97%E6%96%87%E7%AB%A0/" target="_blank" rel="noopener">hexo4.扩展主题的个性化设置-hexo(yilia)+GitHub Pages搭建个人博客系列文章</a></p>]]></content>
    
    <summary type="html">
    
      &lt;h3 id=&quot;前言：&quot;&gt;&lt;a href=&quot;#前言：&quot; class=&quot;headerlink&quot; title=&quot;前言：&quot;&gt;&lt;/a&gt;前言：&lt;/h3&gt;&lt;p&gt;继上次把博客搭建好之后，我便开始学习&lt;strong&gt;MacDown语法&lt;/strong&gt;开始写博客，可以参考github官网上的教程：&lt;a href=&quot;https://guides.github.com/features/mastering-markdown/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;MacDown语法&lt;/a&gt;，MacDown语法其实很简单的，学起来也很快，后续我会单独来用一篇文章来讲其语法。今天我主要是给大家介绍一下这是我在Yilia这个主题下的参考很多前人的经验并且在个人博客上验证的功能的记录。&lt;/p&gt;
    
    </summary>
    
      <category term="Hexo" scheme="https%EF%BC%9A//xiaolei19991030x.github.io/categories/Hexo/"/>
    
    
      <category term="hexo" scheme="https%EF%BC%9A//xiaolei19991030x.github.io/tags/hexo/"/>
    
      <category term="yilia" scheme="https%EF%BC%9A//xiaolei19991030x.github.io/tags/yilia/"/>
    
  </entry>
  
  <entry>
    <title>github+hexo＋yilia搭建自己的博客网站（一）基础入门</title>
    <link href="https%EF%BC%9A//xiaolei19991030x.github.io/Hexo/page-1/"/>
    <id>https：//xiaolei19991030x.github.io/Hexo/page-1/</id>
    <published>2019-08-30T07:35:20.000Z</published>
    <updated>2019-08-30T12:59:18.831Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><script class="meting-secondary-script-marker" src="\assets\js\Meting.min.js"></script><h3 id="前言："><a href="#前言：" class="headerlink" title="前言："></a>前言：</h3><p>最近在学习数据结构的排序算法的时候想尝试写博客，于是在网上翻阅了许多写博客网站，比如CSDN、简书、github等等，相比较之后发现还是在github上搭建自己的博客挺有趣的，翻阅了无数的资料，这其中遇到了很多困难，但最终还是成功了，所以接下来给大家分享一下如何在mac笔记本上搭建自己的博客。</p><a id="more"></a><hr><h3 id="过程："><a href="#过程：" class="headerlink" title="过程："></a>过程：</h3><p>博客的搭建大致分为以下几个步骤：</p><ul><li>配置环境</li><li>安装Hexo</li><li>如何将hexo与github page联系起来</li><li>保留CNAME、README.md等文件</li><li>修改hexo的主题</li><li>写博客</li></ul><h3 id="配置环境"><a href="#配置环境" class="headerlink" title="配置环境"></a>配置环境</h3><ul><li><p>安装Node.js（必须）</p><p> 用来生成静态页面的，去官网直接下载最新版本，默认安装即可。<br> <img src="//xiaolei19991030x.github.io/Hexo/page-1/17.png" alt="17"></p></li></ul><ul><li><p>安装Git（必须）</p><p> 用来把本地的hexo内容提交到github上去，去官网直接下载最新版本，默认安装即可。</p></li><li><p>注册github帐号且配置环境（必须）</p><p>github是一个利用Git进行版本控制、专门用于存放软件代码与内容的共享虚拟主机服务,很多人都把它称作程序员的同性交友网站,具体为啥这么叫我也不知道。（建议大家看英文的网站，不要看中文的）</p></li></ul><p>注册完以后在你的帐号下新建一个仓库（New repository)<br><img src="//xiaolei19991030x.github.io/Hexo/page-1/15.png" alt="15"></p><p><img src="//xiaolei19991030x.github.io/Hexo/page-1/16.png" alt="16"></p><p>以上步骤完成后可用在命令行检查自己是否安装成功,顺便介绍一下如何使用mac的命令行。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">node -v         //查看安装的Node版本</span><br><span class="line"></span><br><span class="line">Git --version  //查看安装的Node版本</span><br></pre></td></tr></table></figure><p>以下是我的Node和Git版本：</p><p><img src="//xiaolei19991030x.github.io/Hexo/page-1/2.png" alt="2"> </p><p><img src="//xiaolei19991030x.github.io/Hexo/page-1/1.png" alt="1">    </p><h3 id="安装Hexo"><a href="#安装Hexo" class="headerlink" title="安装Hexo"></a>安装Hexo</h3><p>Node和Git都安装好后,首先创建一个文件夹,如blog,用户存放hexo的配置文件,然后进入blog里安装Hexo。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">mkdir blog   //创建一个blog文件夹</span><br><span class="line">        </span><br><span class="line">cd blog     //进入blog文件夹</span><br><span class="line">        </span><br><span class="line">sudo npm install-g hexo   //安装hexo</span><br></pre></td></tr></table></figure><p>在安装hexo这一步的时候总是不断报错，在这里花了好长的时间才安装好，具体的命令我也忘了。。。。</p><ul><li>查看hexo版本</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo -v</span><br></pre></td></tr></table></figure><p><img src="//xiaolei19991030x.github.io/Hexo/page-1/5.png" alt="5"></p><ul><li>执行init命令初始化hexo,命令:</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo init</span><br></pre></td></tr></table></figure><p>hexo会自动下载一些文件到这个目录，包括node_modules，目录c结构如下图：</p><p>  <img src="//xiaolei19991030x.github.io/Hexo/page-1/4.png" alt="4"></p><ul><li>生成静态页面</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo g</span><br></pre></td></tr></table></figure><p>生成静态文件到public文件夹，没有public文件夹就会自动创建，如果有了就会覆盖public内容。public文件夹的内容是要提交到github上的。</p><p>  <img src="//xiaolei19991030x.github.io/Hexo/page-1/6.png" alt="6"></p><ul><li>启动本地服务，进行文章预览调试，命令：</li></ul><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo server</span><br></pre></td></tr></table></figure><p>浏览器输入 <a href="http://0.0.0.0:4000/" target="_blank" rel="noopener">http://0.0.0.0:4000/</a> 就可以看到很丑的默认初始页了<br> <img src="//xiaolei19991030x.github.io/Hexo/page-1/7.png" alt="7"></p><h3 id="如何将hexo与github-page联系起来"><a href="#如何将hexo与github-page联系起来" class="headerlink" title="如何将hexo与github page联系起来"></a>如何将hexo与github page联系起来</h3><p>分为三步：</p><ul><li><p>配置SSH key</p></li><li><p>设置Git的user name和email</p></li><li><p>配置deployment</p></li></ul><p>1、配置SSH key</p><p>mac 系统开始就已经为我们安装了ssh，如果没有安装，首先安装打开终端输入查看ssh版本：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ssh -v</span><br></pre></td></tr></table></figure><p><img src="//xiaolei19991030x.github.io/Hexo/page-1/8.png" alt="8"><br>这个表明ssh已经安装</p><p>如果没有安装，在终端输入以下命令：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ssh-keygen -t rsa -C &quot;youremail@example.com&quot;</span><br></pre></td></tr></table></figure><p>然后连续3次回车，最终会生成一个文件在用户目录下</p><p><img src="//xiaolei19991030x.github.io/Hexo/page-1/9.png" alt="9"></p><p> 然后打开用户目录，找到.ssh\id_rsa.pub文件，记事本打开并复制里面的内容，打开你的github主页，进入个人设置 -&gt; SSH and GPG keys -&gt; New SSH key：</p><p>这里我是用终端来操作的,命令如下：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">cd .ssh      //进入.ssh文件夹</span><br><span class="line"></span><br><span class="line">ls          //查看.ssh里面的文件</span><br><span class="line"></span><br><span class="line">cat id_rsa.pub   //查看id_rsa.pub里的内容</span><br></pre></td></tr></table></figure><p><img src="//xiaolei19991030x.github.io/Hexo/page-1/10.png" alt="10"></p><p>将复制的内容粘贴到key那里，title随便填，保存</p><p><img src="//xiaolei19991030x.github.io/Hexo/page-1/11.png" alt="11"></p><p>测试一下是否成功</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ssh -T git@github.com  //注意邮箱地址不用改</span><br></pre></td></tr></table></figure><p><img src="//xiaolei19991030x.github.io/Hexo/page-1/18.png" alt="18"></p><p>看到这个信息说明SSH已配置成功！</p><p>2.设置Git的user name和email</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">git config --global user.name &quot;xiaolei19991030x&quot;        // 你的github用户名，非昵称</span><br><span class="line"></span><br><span class="line">git config --global user.email  &quot;1784640836@qq.com&quot;     // 填写你的github注册邮箱</span><br></pre></td></tr></table></figure><p> 3.设置deployment</p><p>配置blog/_config.yml中有关deploy的部分</p><p><img src="//xiaolei19991030x.github.io/Hexo/page-1/12.png" alt="12"></p><p>正确写法：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">deploy:</span><br><span class="line">type: git </span><br><span class="line">repository：git@github.com:username/username.github.io.git  </span><br><span class="line">branch: master</span><br></pre></td></tr></table></figure><p>注意：repository这种形式的是配置了SSH Key之后的，如果没有配置则使用Https形式的地址,冒号后面一定要空一格不然会报错的！！！</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">repository: https://github.com/username/username.github.io.git</span><br></pre></td></tr></table></figure><p>为了能够使Hexo部署到GitHub上，需要安装一个插件:</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install hexo-deployer-git --save</span><br></pre></td></tr></table></figure><p>然后输入以下命令：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">hexo clean</span><br><span class="line">hexo g</span><br><span class="line">hexo d</span><br></pre></td></tr></table></figure><p>这时打开你的在浏览器上看输入<a href>https://yourgithubname.github.io/</a>就可以看啦，当然如果看到你想到的效果，这可能是github需要一定的时间部署，等一会儿看有没有变成你想要的样子。</p><p>自己的github的page，显示如下<br><img src="//xiaolei19991030x.github.io/Hexo/page-1/3.jpg" alt="3"></p><p>同时，你的github上的项目，代码已经更新。</p><h3 id="保留CNAME、README-md等文件"><a href="#保留CNAME、README-md等文件" class="headerlink" title="保留CNAME、README.md等文件"></a>保留CNAME、README.md等文件</h3><p>提交之后网页上一看，发现以前其它代码都没了，此时不要慌，一些非md文件可以把他们放到source文件夹下，这里的所有文件都会原样复制（除了md文件）到public目录。</p><p>由于hexo默认会把所有md文件都转换成html，包括README.md，所有需要每次生成之后、上传之前，手动将README.md复制到public目录，并删除README.html。        </p><h3 id="修改hexo的主题"><a href="#修改hexo的主题" class="headerlink" title="修改hexo的主题"></a>修改hexo的主题</h3><p>在 Hexo 中有两份主要的配置文件，其名称都是 _config.yml。 其中，一份位于站点根目录下，主要包含 Hexo 本身的配置；另一份位于主题目录下，这份配置由主题作者提供，主要用于配置主题相关的选项。</p><p>为了描述方便，在以下说明中，将前者称为 <strong>站点配置文件</strong>， 后者称为 <strong>主题配置文件</strong>.</p><p>以我的为例：</p><p><img src="//xiaolei19991030x.github.io/Hexo/page-1/13.png" alt="13"></p><p>开始更换主题，hexo默认的主题是landscape,这里我更换的是yilia主题。</p><p>1、clone主题代码</p><p>首先进入blog文件夹</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cd blog</span><br></pre></td></tr></table></figure><p>在终端的根目录blog下执行：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git clone https://github.com/litten/hexo-theme-yilia.git themes/yilia</span><br></pre></td></tr></table></figure><p>2、修改配置文件</p><p>修改根目录下的_config.yml文件：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">theme: yilia    //默认为landscape</span><br></pre></td></tr></table></figure><p>3、修改themes/yilia/_config.yml文件：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br></pre></td><td class="code"><pre><span class="line"># Header</span><br><span class="line"></span><br><span class="line">menu:</span><br><span class="line">  主页: <span class="regexp">/</span></span><br><span class="line"><span class="regexp">  所有文章: /</span>allPages</span><br><span class="line">  随笔: <span class="regexp">/tags</span></span><br><span class="line"><span class="regexp">  相册: /</span>photos</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"># SubNav</span><br><span class="line">subnav:</span><br><span class="line">  github: <span class="string">"https://github.com/xiaolei19991030x"</span></span><br><span class="line">  weibo: <span class="string">"#"</span></span><br><span class="line">  rss: <span class="string">"#"</span></span><br><span class="line">  zhihu: <span class="string">"#"</span></span><br><span class="line">  qq: http:<span class="comment">//wpa.qq.com/msgrd?v=3&amp;1784640836=2604068029&amp;site=qq&amp;menu=yes</span></span><br><span class="line">  #weixin: "#"</span><br><span class="line">  #jianshu: "#"</span><br><span class="line">  #douban: "#"</span><br><span class="line">  #segmentfault: "#"</span><br><span class="line">  #bilibili: "#"</span><br><span class="line">  #acfun: "#"</span><br><span class="line">  #mail: "mailto:litten225@qq.com"</span><br><span class="line">  #facebook: "#"</span><br><span class="line">  #google: "#"</span><br><span class="line">  #twitter: "#"</span><br><span class="line">  #linkedin: "#"</span><br><span class="line"></span><br><span class="line">rss: <span class="regexp">/atom.xml</span></span><br><span class="line"><span class="regexp"></span></span><br><span class="line"><span class="regexp"># 是否需要修改 root 路径</span></span><br><span class="line"><span class="regexp"># 如果您的网站存放在子目录中，例如 http:/</span><span class="regexp">/yoursite.com/</span>blog，</span><br><span class="line"># 请将您的 url 设为 http://yoursite.com/blog 并把 root 设为 /blog/。</span><br><span class="line">root: <span class="regexp">/</span></span><br><span class="line"><span class="regexp"></span></span><br><span class="line"><span class="regexp"># Content</span></span><br><span class="line"><span class="regexp"></span></span><br><span class="line"><span class="regexp"># 文章太长，截断按钮文字</span></span><br><span class="line"><span class="regexp">excerpt_link: more</span></span><br><span class="line"><span class="regexp"># 文章卡片右下角常驻链接，不需要请设置为false</span></span><br><span class="line"><span class="regexp">show_all_link: '展开全文'</span></span><br><span class="line"><span class="regexp"># 数学公式</span></span><br><span class="line"><span class="regexp">mathjax: true</span></span><br><span class="line"><span class="regexp"># 是否在新窗口打开链接</span></span><br><span class="line"><span class="regexp">open_in_new: true</span></span><br><span class="line"><span class="regexp"></span></span><br><span class="line"><span class="regexp"># 打赏</span></span><br><span class="line"><span class="regexp"># 打赏type设定：0-关闭打赏； 1-文章对应的md文件里有reward:true属性，才有打赏； 2-所有文章均有打赏</span></span><br><span class="line"><span class="regexp">reward_type: 2</span></span><br><span class="line"><span class="regexp"># 打赏wording</span></span><br><span class="line"><span class="regexp">reward_wording: '谢谢你请我吃糖果'</span></span><br><span class="line"><span class="regexp"># 支付宝二维码图片地址，跟你设置头像的方式一样。比如：/</span>assets/img/alipay.jpg</span><br><span class="line">alipay: </span><br><span class="line"># 微信二维码图片地址</span><br><span class="line">weixin: </span><br><span class="line"></span><br><span class="line"># 目录</span><br><span class="line"># 目录设定：0-不显示目录； 1-文章对应的md文件里有toc:true属性，才有目录； 2-所有文章均显示目录</span><br><span class="line">toc: <span class="number">1</span></span><br><span class="line"># 根据自己的习惯来设置，如果你的目录标题习惯有标号，置为true即可隐藏hexo重复的序号；否则置为false</span><br><span class="line">toc_hide_index: <span class="literal">true</span></span><br><span class="line"># 目录为空时的提示</span><br><span class="line">toc_empty_wording: <span class="string">'目录，不存在的…'</span></span><br><span class="line"></span><br><span class="line"># 是否有快速回到顶部的按钮</span><br><span class="line">top: <span class="literal">true</span></span><br><span class="line"></span><br><span class="line"># Miscellaneous</span><br><span class="line">baidu_analytics: <span class="string">''</span></span><br><span class="line">google_analytics: <span class="string">''</span></span><br><span class="line">favicon: <span class="regexp">/img/</span>header.jpg</span><br><span class="line"></span><br><span class="line">#你的头像url</span><br><span class="line">avatar: <span class="regexp">/img/</span>header.jpg</span><br><span class="line"></span><br><span class="line">#是否开启分享</span><br><span class="line">share_jia: <span class="literal">true</span></span><br><span class="line"></span><br><span class="line">#评论：1、多说；2、网易云跟帖；3、畅言；4、Disqus；5、Gitment</span><br><span class="line">#不需要使用某项，直接设置值为false，或注释掉</span><br><span class="line">#具体请参考wiki：https://github.com/litten/hexo-theme-yilia/wiki/</span><br><span class="line"></span><br><span class="line">#1、多说</span><br><span class="line">duoshuo: <span class="literal">true</span></span><br><span class="line"></span><br><span class="line">#2、网易云跟帖</span><br><span class="line">wangyiyun:  <span class="literal">true</span></span><br><span class="line"></span><br><span class="line">#3、畅言</span><br><span class="line">changyan_appid: <span class="literal">false</span></span><br><span class="line">changyan_conf: <span class="literal">false</span></span><br><span class="line"></span><br><span class="line">#4、Disqus 在hexo根目录的config里也有disqus_shortname字段，优先使用yilia的</span><br><span class="line">disqus: <span class="literal">false</span></span><br><span class="line"></span><br><span class="line">#5、Gitment</span><br><span class="line">gitment_owner: true      #你的 GitHub ID</span><br><span class="line">gitment_repo: ''          #存储评论的 repo</span><br><span class="line">gitment_oauth:</span><br><span class="line">  client_id: ''           #client ID</span><br><span class="line">  client_secret: ''       #client secret</span><br><span class="line"></span><br><span class="line"># 样式定制 - 一般不需要修改，除非有很强的定制欲望…</span><br><span class="line">style:</span><br><span class="line">  # 头像上面的背景颜色</span><br><span class="line">  header: <span class="string">'#4d4d4d'</span></span><br><span class="line">  # 右滑板块背景</span><br><span class="line">  slider: <span class="string">'linear-gradient(200deg,#a0cfe4,#e8c37e)'</span></span><br><span class="line"></span><br><span class="line"># slider的设置</span><br><span class="line">slider:</span><br><span class="line">  # 是否默认展开tags板块</span><br><span class="line">  showTags: <span class="literal">false</span></span><br><span class="line"></span><br><span class="line"># 智能菜单</span><br><span class="line"># 如不需要，将该对应项置为false</span><br><span class="line"># 比如</span><br><span class="line">#smart_menu:</span><br><span class="line">#  friends: false</span><br><span class="line">smart_menu:</span><br><span class="line">  innerArchive: <span class="string">'所有文章'</span></span><br><span class="line">  friends: <span class="string">'友链'</span></span><br><span class="line">  aboutme: <span class="string">'关于我'</span></span><br><span class="line"></span><br><span class="line">friends:</span><br><span class="line">  友情链接<span class="number">1</span>: http:<span class="comment">//localhost:4000/</span></span><br><span class="line">  友情链接<span class="number">2</span>: http:<span class="comment">//localhost:4000/</span></span><br><span class="line">  友情链接<span class="number">3</span>: http:<span class="comment">//localhost:4000/</span></span><br><span class="line">  友情链接<span class="number">4</span>: http:<span class="comment">//localhost:4000/</span></span><br><span class="line">  友情链接<span class="number">5</span>: http:<span class="comment">//localhost:4000/</span></span><br><span class="line">  友情链接<span class="number">6</span>: http:<span class="comment">//localhost:4000/</span></span><br><span class="line"></span><br><span class="line">aboutme: 本科&lt;br&gt;&lt;br&gt;目前大三在校生&lt;br&gt;java开发实习工程师</span><br></pre></td></tr></table></figure><p>4、运行</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">hexo clean   //清空之前主题</span><br><span class="line"></span><br><span class="line">hexo g     //生成静态文件</span><br><span class="line"></span><br><span class="line">hexo s     //在本地运行</span><br><span class="line"></span><br><span class="line">hexo d    //发布到github的page上</span><br></pre></td></tr></table></figure><p>这是我更换主题过后的最原始的博客页面：</p><p><img src="//xiaolei19991030x.github.io/Hexo/page-1/14.png" alt="14"></p><h3 id="写博客"><a href="#写博客" class="headerlink" title="写博客"></a>写博客</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo new &apos;博客文章名字&apos;</span><br></pre></td></tr></table></figure><p>   运行测试</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo s -g   //生成静态文件，启动本地服务器</span><br></pre></td></tr></table></figure><hr><p>最后附上我的博客地址：<a href>https://xiaolei19991030x.github.io</a></p><p>到这里基本的博客的搭建就已经结束了，后续再继续更新啦，下次见！！！   </p>]]></content>
    
    <summary type="html">
    
      &lt;h3 id=&quot;前言：&quot;&gt;&lt;a href=&quot;#前言：&quot; class=&quot;headerlink&quot; title=&quot;前言：&quot;&gt;&lt;/a&gt;前言：&lt;/h3&gt;&lt;p&gt;最近在学习数据结构的排序算法的时候想尝试写博客，于是在网上翻阅了许多写博客网站，比如CSDN、简书、github等等，相比较之后发现还是在github上搭建自己的博客挺有趣的，翻阅了无数的资料，这其中遇到了很多困难，但最终还是成功了，所以接下来给大家分享一下如何在mac笔记本上搭建自己的博客。&lt;/p&gt;
    
    </summary>
    
      <category term="Hexo" scheme="https%EF%BC%9A//xiaolei19991030x.github.io/categories/Hexo/"/>
    
    
      <category term="node" scheme="https%EF%BC%9A//xiaolei19991030x.github.io/tags/node/"/>
    
      <category term="Git" scheme="https%EF%BC%9A//xiaolei19991030x.github.io/tags/Git/"/>
    
      <category term="hexo" scheme="https%EF%BC%9A//xiaolei19991030x.github.io/tags/hexo/"/>
    
      <category term="SSH" scheme="https%EF%BC%9A//xiaolei19991030x.github.io/tags/SSH/"/>
    
      <category term="github page" scheme="https%EF%BC%9A//xiaolei19991030x.github.io/tags/github-page/"/>
    
      <category term="yilia" scheme="https%EF%BC%9A//xiaolei19991030x.github.io/tags/yilia/"/>
    
      <category term="博客搭建" scheme="https%EF%BC%9A//xiaolei19991030x.github.io/tags/%E5%8D%9A%E5%AE%A2%E6%90%AD%E5%BB%BA/"/>
    
  </entry>
  
</feed>
