This commit is contained in:
krahets
2024-03-18 03:11:11 +08:00
parent 2980b1515a
commit 60eb82b66b
123 changed files with 2286 additions and 2115 deletions

View File

@@ -3131,9 +3131,9 @@
<a id="__codelineno-21-18" name="__codelineno-21-18" href="#__codelineno-21-18"></a><span class="cm">/* 基于双向链表实现的双向队列 */</span>
<a id="__codelineno-21-19" name="__codelineno-21-19" href="#__codelineno-21-19"></a><span class="cp">#[allow(dead_code)]</span>
<a id="__codelineno-21-20" name="__codelineno-21-20" href="#__codelineno-21-20"></a><span class="k">pub</span><span class="w"> </span><span class="k">struct</span> <span class="nc">LinkedListDeque</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-21-21" name="__codelineno-21-21" href="#__codelineno-21-21"></a><span class="w"> </span><span class="n">front</span>: <span class="nb">Option</span><span class="o">&lt;</span><span class="n">Rc</span><span class="o">&lt;</span><span class="n">RefCell</span><span class="o">&lt;</span><span class="n">ListNode</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;&gt;&gt;&gt;</span><span class="p">,</span><span class="w"> </span><span class="c1">// 头节点 front</span>
<a id="__codelineno-21-22" name="__codelineno-21-22" href="#__codelineno-21-22"></a><span class="w"> </span><span class="n">rear</span>: <span class="nb">Option</span><span class="o">&lt;</span><span class="n">Rc</span><span class="o">&lt;</span><span class="n">RefCell</span><span class="o">&lt;</span><span class="n">ListNode</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;&gt;&gt;&gt;</span><span class="p">,</span><span class="w"> </span><span class="c1">// 尾节点 rear </span>
<a id="__codelineno-21-23" name="__codelineno-21-23" href="#__codelineno-21-23"></a><span class="w"> </span><span class="n">que_size</span>: <span class="kt">usize</span><span class="p">,</span><span class="w"> </span><span class="c1">// 双向队列的长度</span>
<a id="__codelineno-21-21" name="__codelineno-21-21" href="#__codelineno-21-21"></a><span class="w"> </span><span class="n">front</span>: <span class="nb">Option</span><span class="o">&lt;</span><span class="n">Rc</span><span class="o">&lt;</span><span class="n">RefCell</span><span class="o">&lt;</span><span class="n">ListNode</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;&gt;&gt;&gt;</span><span class="p">,</span><span class="w"> </span><span class="c1">// 头节点 front</span>
<a id="__codelineno-21-22" name="__codelineno-21-22" href="#__codelineno-21-22"></a><span class="w"> </span><span class="n">rear</span>: <span class="nb">Option</span><span class="o">&lt;</span><span class="n">Rc</span><span class="o">&lt;</span><span class="n">RefCell</span><span class="o">&lt;</span><span class="n">ListNode</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;&gt;&gt;&gt;</span><span class="p">,</span><span class="w"> </span><span class="c1">// 尾节点 rear</span>
<a id="__codelineno-21-23" name="__codelineno-21-23" href="#__codelineno-21-23"></a><span class="w"> </span><span class="n">que_size</span>: <span class="kt">usize</span><span class="p">,</span><span class="w"> </span><span class="c1">// 双向队列的长度</span>
<a id="__codelineno-21-24" name="__codelineno-21-24" href="#__codelineno-21-24"></a><span class="p">}</span>
<a id="__codelineno-21-25" name="__codelineno-21-25" href="#__codelineno-21-25"></a>
<a id="__codelineno-21-26" name="__codelineno-21-26" href="#__codelineno-21-26"></a><span class="k">impl</span><span class="o">&lt;</span><span class="n">T</span>: <span class="nb">Copy</span><span class="o">&gt;</span><span class="w"> </span><span class="n">LinkedListDeque</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="w"> </span><span class="p">{</span>
@@ -3141,7 +3141,7 @@
<a id="__codelineno-21-28" name="__codelineno-21-28" href="#__codelineno-21-28"></a><span class="w"> </span><span class="bp">Self</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-21-29" name="__codelineno-21-29" href="#__codelineno-21-29"></a><span class="w"> </span><span class="n">front</span>: <span class="nb">None</span><span class="p">,</span>
<a id="__codelineno-21-30" name="__codelineno-21-30" href="#__codelineno-21-30"></a><span class="w"> </span><span class="n">rear</span>: <span class="nb">None</span><span class="p">,</span>
<a id="__codelineno-21-31" name="__codelineno-21-31" href="#__codelineno-21-31"></a><span class="w"> </span><span class="n">que_size</span>: <span class="mi">0</span><span class="p">,</span><span class="w"> </span>
<a id="__codelineno-21-31" name="__codelineno-21-31" href="#__codelineno-21-31"></a><span class="w"> </span><span class="n">que_size</span>: <span class="mi">0</span><span class="p">,</span>
<a id="__codelineno-21-32" name="__codelineno-21-32" href="#__codelineno-21-32"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-21-33" name="__codelineno-21-33" href="#__codelineno-21-33"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-21-34" name="__codelineno-21-34" href="#__codelineno-21-34"></a>
@@ -3173,7 +3173,7 @@
<a id="__codelineno-21-60" name="__codelineno-21-60" href="#__codelineno-21-60"></a><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">front</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">Some</span><span class="p">(</span><span class="n">node</span><span class="p">);</span><span class="w"> </span><span class="c1">// 更新头节点</span>
<a id="__codelineno-21-61" name="__codelineno-21-61" href="#__codelineno-21-61"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-21-62" name="__codelineno-21-62" href="#__codelineno-21-62"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-21-63" name="__codelineno-21-63" href="#__codelineno-21-63"></a><span class="w"> </span><span class="p">}</span><span class="w"> </span>
<a id="__codelineno-21-63" name="__codelineno-21-63" href="#__codelineno-21-63"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-21-64" name="__codelineno-21-64" href="#__codelineno-21-64"></a><span class="w"> </span><span class="c1">// 队尾入队操作</span>
<a id="__codelineno-21-65" name="__codelineno-21-65" href="#__codelineno-21-65"></a><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-21-66" name="__codelineno-21-66" href="#__codelineno-21-66"></a><span class="w"> </span><span class="k">match</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">rear</span><span class="p">.</span><span class="n">take</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
@@ -3206,8 +3206,8 @@
<a id="__codelineno-21-93" name="__codelineno-21-93" href="#__codelineno-21-93"></a><span class="w"> </span><span class="cm">/* 出队操作 */</span>
<a id="__codelineno-21-94" name="__codelineno-21-94" href="#__codelineno-21-94"></a><span class="w"> </span><span class="k">pub</span><span class="w"> </span><span class="k">fn</span> <span class="nf">pop</span><span class="p">(</span><span class="o">&amp;</span><span class="k">mut</span><span class="w"> </span><span class="bp">self</span><span class="p">,</span><span class="w"> </span><span class="n">is_front</span>: <span class="kt">bool</span><span class="p">)</span><span class="w"> </span>-&gt; <span class="nb">Option</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-21-95" name="__codelineno-21-95" href="#__codelineno-21-95"></a><span class="w"> </span><span class="c1">// 若队列为空,直接返回 None</span>
<a id="__codelineno-21-96" name="__codelineno-21-96" href="#__codelineno-21-96"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">is_empty</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w"> </span>
<a id="__codelineno-21-97" name="__codelineno-21-97" href="#__codelineno-21-97"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nb">None</span><span class="w"> </span>
<a id="__codelineno-21-96" name="__codelineno-21-96" href="#__codelineno-21-96"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">is_empty</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-21-97" name="__codelineno-21-97" href="#__codelineno-21-97"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nb">None</span><span class="p">;</span>
<a id="__codelineno-21-98" name="__codelineno-21-98" href="#__codelineno-21-98"></a><span class="w"> </span><span class="p">};</span>
<a id="__codelineno-21-99" name="__codelineno-21-99" href="#__codelineno-21-99"></a><span class="w"> </span><span class="c1">// 队首出队操作</span>
<a id="__codelineno-21-100" name="__codelineno-21-100" href="#__codelineno-21-100"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">is_front</span><span class="w"> </span><span class="p">{</span>
@@ -3215,7 +3215,7 @@
<a id="__codelineno-21-102" name="__codelineno-21-102" href="#__codelineno-21-102"></a><span class="w"> </span><span class="k">match</span><span class="w"> </span><span class="n">old_front</span><span class="p">.</span><span class="n">borrow_mut</span><span class="p">().</span><span class="n">next</span><span class="p">.</span><span class="n">take</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-21-103" name="__codelineno-21-103" href="#__codelineno-21-103"></a><span class="w"> </span><span class="nb">Some</span><span class="p">(</span><span class="n">new_front</span><span class="p">)</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-21-104" name="__codelineno-21-104" href="#__codelineno-21-104"></a><span class="w"> </span><span class="n">new_front</span><span class="p">.</span><span class="n">borrow_mut</span><span class="p">().</span><span class="n">prev</span><span class="p">.</span><span class="n">take</span><span class="p">();</span>
<a id="__codelineno-21-105" name="__codelineno-21-105" href="#__codelineno-21-105"></a><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">front</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">Some</span><span class="p">(</span><span class="n">new_front</span><span class="p">);</span><span class="w"> </span><span class="c1">// 更新头节点</span>
<a id="__codelineno-21-105" name="__codelineno-21-105" href="#__codelineno-21-105"></a><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">front</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">Some</span><span class="p">(</span><span class="n">new_front</span><span class="p">);</span><span class="w"> </span><span class="c1">// 更新头节点</span>
<a id="__codelineno-21-106" name="__codelineno-21-106" href="#__codelineno-21-106"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-21-107" name="__codelineno-21-107" href="#__codelineno-21-107"></a><span class="w"> </span><span class="nb">None</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-21-108" name="__codelineno-21-108" href="#__codelineno-21-108"></a><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">rear</span><span class="p">.</span><span class="n">take</span><span class="p">();</span>
@@ -3224,56 +3224,55 @@
<a id="__codelineno-21-111" name="__codelineno-21-111" href="#__codelineno-21-111"></a><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">que_size</span><span class="w"> </span><span class="o">-=</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span><span class="w"> </span><span class="c1">// 更新队列长度</span>
<a id="__codelineno-21-112" name="__codelineno-21-112" href="#__codelineno-21-112"></a><span class="w"> </span><span class="n">Rc</span>::<span class="n">try_unwrap</span><span class="p">(</span><span class="n">old_front</span><span class="p">).</span><span class="n">ok</span><span class="p">().</span><span class="n">unwrap</span><span class="p">().</span><span class="n">into_inner</span><span class="p">().</span><span class="n">val</span>
<a id="__codelineno-21-113" name="__codelineno-21-113" href="#__codelineno-21-113"></a><span class="w"> </span><span class="p">})</span>
<a id="__codelineno-21-114" name="__codelineno-21-114" href="#__codelineno-21-114"></a>
<a id="__codelineno-21-115" name="__codelineno-21-115" href="#__codelineno-21-115"></a><span class="w"> </span><span class="p">}</span><span class="w"> </span>
<a id="__codelineno-21-116" name="__codelineno-21-116" href="#__codelineno-21-116"></a><span class="w"> </span><span class="c1">// 队尾出队操作</span>
<a id="__codelineno-21-117" name="__codelineno-21-117" href="#__codelineno-21-117"></a><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-21-118" name="__codelineno-21-118" href="#__codelineno-21-118"></a><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">rear</span><span class="p">.</span><span class="n">take</span><span class="p">().</span><span class="n">map</span><span class="p">(</span><span class="o">|</span><span class="n">old_rear</span><span class="o">|</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-21-119" name="__codelineno-21-119" href="#__codelineno-21-119"></a><span class="w"> </span><span class="k">match</span><span class="w"> </span><span class="n">old_rear</span><span class="p">.</span><span class="n">borrow_mut</span><span class="p">().</span><span class="n">prev</span><span class="p">.</span><span class="n">take</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-21-120" name="__codelineno-21-120" href="#__codelineno-21-120"></a><span class="w"> </span><span class="nb">Some</span><span class="p">(</span><span class="n">new_rear</span><span class="p">)</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-21-121" name="__codelineno-21-121" href="#__codelineno-21-121"></a><span class="w"> </span><span class="n">new_rear</span><span class="p">.</span><span class="n">borrow_mut</span><span class="p">().</span><span class="n">next</span><span class="p">.</span><span class="n">take</span><span class="p">();</span>
<a id="__codelineno-21-122" name="__codelineno-21-122" href="#__codelineno-21-122"></a><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">rear</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">Some</span><span class="p">(</span><span class="n">new_rear</span><span class="p">);</span><span class="w"> </span><span class="c1">// 更新尾节点</span>
<a id="__codelineno-21-123" name="__codelineno-21-123" href="#__codelineno-21-123"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-21-124" name="__codelineno-21-124" href="#__codelineno-21-124"></a><span class="w"> </span><span class="nb">None</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-21-125" name="__codelineno-21-125" href="#__codelineno-21-125"></a><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">front</span><span class="p">.</span><span class="n">take</span><span class="p">();</span>
<a id="__codelineno-21-126" name="__codelineno-21-126" href="#__codelineno-21-126"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-21-127" name="__codelineno-21-127" href="#__codelineno-21-127"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-21-128" name="__codelineno-21-128" href="#__codelineno-21-128"></a><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">que_size</span><span class="w"> </span><span class="o">-=</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span><span class="w"> </span><span class="c1">// 更新队列长度</span>
<a id="__codelineno-21-129" name="__codelineno-21-129" href="#__codelineno-21-129"></a><span class="w"> </span><span class="n">Rc</span>::<span class="n">try_unwrap</span><span class="p">(</span><span class="n">old_rear</span><span class="p">).</span><span class="n">ok</span><span class="p">().</span><span class="n">unwrap</span><span class="p">().</span><span class="n">into_inner</span><span class="p">().</span><span class="n">val</span>
<a id="__codelineno-21-130" name="__codelineno-21-130" href="#__codelineno-21-130"></a><span class="w"> </span><span class="p">})</span>
<a id="__codelineno-21-131" name="__codelineno-21-131" href="#__codelineno-21-131"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-21-132" name="__codelineno-21-132" href="#__codelineno-21-132"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-21-133" name="__codelineno-21-133" href="#__codelineno-21-133"></a>
<a id="__codelineno-21-134" name="__codelineno-21-134" href="#__codelineno-21-134"></a><span class="w"> </span><span class="cm">/* 队首出队 */</span>
<a id="__codelineno-21-135" name="__codelineno-21-135" href="#__codelineno-21-135"></a><span class="w"> </span><span class="k">pub</span><span class="w"> </span><span class="k">fn</span> <span class="nf">pop_first</span><span class="p">(</span><span class="o">&amp;</span><span class="k">mut</span><span class="w"> </span><span class="bp">self</span><span class="p">)</span><span class="w"> </span>-&gt; <span class="nb">Option</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-21-136" name="__codelineno-21-136" href="#__codelineno-21-136"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">pop</span><span class="p">(</span><span class="kc">true</span><span class="p">);</span>
<a id="__codelineno-21-137" name="__codelineno-21-137" href="#__codelineno-21-137"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-21-138" name="__codelineno-21-138" href="#__codelineno-21-138"></a>
<a id="__codelineno-21-139" name="__codelineno-21-139" href="#__codelineno-21-139"></a><span class="w"> </span><span class="cm">/* 队尾出队 */</span>
<a id="__codelineno-21-140" name="__codelineno-21-140" href="#__codelineno-21-140"></a><span class="w"> </span><span class="k">pub</span><span class="w"> </span><span class="k">fn</span> <span class="nf">pop_last</span><span class="p">(</span><span class="o">&amp;</span><span class="k">mut</span><span class="w"> </span><span class="bp">self</span><span class="p">)</span><span class="w"> </span>-&gt; <span class="nb">Option</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-21-141" name="__codelineno-21-141" href="#__codelineno-21-141"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">pop</span><span class="p">(</span><span class="kc">false</span><span class="p">);</span>
<a id="__codelineno-21-142" name="__codelineno-21-142" href="#__codelineno-21-142"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-21-143" name="__codelineno-21-143" href="#__codelineno-21-143"></a>
<a id="__codelineno-21-144" name="__codelineno-21-144" href="#__codelineno-21-144"></a><span class="w"> </span><span class="cm">/* 访问队首元素 */</span>
<a id="__codelineno-21-145" name="__codelineno-21-145" href="#__codelineno-21-145"></a><span class="w"> </span><span class="k">pub</span><span class="w"> </span><span class="k">fn</span> <span class="nf">peek_first</span><span class="p">(</span><span class="o">&amp;</span><span class="bp">self</span><span class="p">)</span><span class="w"> </span>-&gt; <span class="nb">Option</span><span class="o">&lt;&amp;</span><span class="n">Rc</span><span class="o">&lt;</span><span class="n">RefCell</span><span class="o">&lt;</span><span class="n">ListNode</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;&gt;&gt;&gt;</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-21-146" name="__codelineno-21-146" href="#__codelineno-21-146"></a><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">front</span><span class="p">.</span><span class="n">as_ref</span><span class="p">()</span>
<a id="__codelineno-21-147" name="__codelineno-21-147" href="#__codelineno-21-147"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-21-148" name="__codelineno-21-148" href="#__codelineno-21-148"></a>
<a id="__codelineno-21-149" name="__codelineno-21-149" href="#__codelineno-21-149"></a><span class="w"> </span><span class="cm">/* 访问队尾元素 */</span>
<a id="__codelineno-21-150" name="__codelineno-21-150" href="#__codelineno-21-150"></a><span class="w"> </span><span class="k">pub</span><span class="w"> </span><span class="k">fn</span> <span class="nf">peek_last</span><span class="p">(</span><span class="o">&amp;</span><span class="bp">self</span><span class="p">)</span><span class="w"> </span>-&gt; <span class="nb">Option</span><span class="o">&lt;&amp;</span><span class="n">Rc</span><span class="o">&lt;</span><span class="n">RefCell</span><span class="o">&lt;</span><span class="n">ListNode</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;&gt;&gt;&gt;</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-21-151" name="__codelineno-21-151" href="#__codelineno-21-151"></a><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">rear</span><span class="p">.</span><span class="n">as_ref</span><span class="p">()</span>
<a id="__codelineno-21-152" name="__codelineno-21-152" href="#__codelineno-21-152"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-21-153" name="__codelineno-21-153" href="#__codelineno-21-153"></a>
<a id="__codelineno-21-154" name="__codelineno-21-154" href="#__codelineno-21-154"></a><span class="w"> </span><span class="cm">/* 返回数组用于打印 */</span>
<a id="__codelineno-21-155" name="__codelineno-21-155" href="#__codelineno-21-155"></a><span class="w"> </span><span class="k">pub</span><span class="w"> </span><span class="k">fn</span> <span class="nf">to_array</span><span class="p">(</span><span class="o">&amp;</span><span class="bp">self</span><span class="p">,</span><span class="w"> </span><span class="n">head</span>: <span class="nb">Option</span><span class="o">&lt;&amp;</span><span class="n">Rc</span><span class="o">&lt;</span><span class="n">RefCell</span><span class="o">&lt;</span><span class="n">ListNode</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;&gt;&gt;&gt;</span><span class="p">)</span><span class="w"> </span>-&gt; <span class="nb">Vec</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-21-156" name="__codelineno-21-156" href="#__codelineno-21-156"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="nb">Some</span><span class="p">(</span><span class="n">node</span><span class="p">)</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">head</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-21-157" name="__codelineno-21-157" href="#__codelineno-21-157"></a><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="k">mut</span><span class="w"> </span><span class="n">nums</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">to_array</span><span class="p">(</span><span class="n">node</span><span class="p">.</span><span class="n">borrow</span><span class="p">().</span><span class="n">next</span><span class="p">.</span><span class="n">as_ref</span><span class="p">());</span>
<a id="__codelineno-21-158" name="__codelineno-21-158" href="#__codelineno-21-158"></a><span class="w"> </span><span class="n">nums</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">borrow</span><span class="p">().</span><span class="n">val</span><span class="p">);</span>
<a id="__codelineno-21-159" name="__codelineno-21-159" href="#__codelineno-21-159"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">nums</span><span class="p">;</span>
<a id="__codelineno-21-160" name="__codelineno-21-160" href="#__codelineno-21-160"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-21-161" name="__codelineno-21-161" href="#__codelineno-21-161"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nb">Vec</span>::<span class="n">new</span><span class="p">();</span>
<a id="__codelineno-21-162" name="__codelineno-21-162" href="#__codelineno-21-162"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-21-163" name="__codelineno-21-163" href="#__codelineno-21-163"></a><span class="p">}</span>
<a id="__codelineno-21-114" name="__codelineno-21-114" href="#__codelineno-21-114"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-21-115" name="__codelineno-21-115" href="#__codelineno-21-115"></a><span class="w"> </span><span class="c1">// 队尾出队操作</span>
<a id="__codelineno-21-116" name="__codelineno-21-116" href="#__codelineno-21-116"></a><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-21-117" name="__codelineno-21-117" href="#__codelineno-21-117"></a><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">rear</span><span class="p">.</span><span class="n">take</span><span class="p">().</span><span class="n">map</span><span class="p">(</span><span class="o">|</span><span class="n">old_rear</span><span class="o">|</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-21-118" name="__codelineno-21-118" href="#__codelineno-21-118"></a><span class="w"> </span><span class="k">match</span><span class="w"> </span><span class="n">old_rear</span><span class="p">.</span><span class="n">borrow_mut</span><span class="p">().</span><span class="n">prev</span><span class="p">.</span><span class="n">take</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-21-119" name="__codelineno-21-119" href="#__codelineno-21-119"></a><span class="w"> </span><span class="nb">Some</span><span class="p">(</span><span class="n">new_rear</span><span class="p">)</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-21-120" name="__codelineno-21-120" href="#__codelineno-21-120"></a><span class="w"> </span><span class="n">new_rear</span><span class="p">.</span><span class="n">borrow_mut</span><span class="p">().</span><span class="n">next</span><span class="p">.</span><span class="n">take</span><span class="p">();</span>
<a id="__codelineno-21-121" name="__codelineno-21-121" href="#__codelineno-21-121"></a><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">rear</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">Some</span><span class="p">(</span><span class="n">new_rear</span><span class="p">);</span><span class="w"> </span><span class="c1">// 更新尾节点</span>
<a id="__codelineno-21-122" name="__codelineno-21-122" href="#__codelineno-21-122"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-21-123" name="__codelineno-21-123" href="#__codelineno-21-123"></a><span class="w"> </span><span class="nb">None</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-21-124" name="__codelineno-21-124" href="#__codelineno-21-124"></a><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">front</span><span class="p">.</span><span class="n">take</span><span class="p">();</span>
<a id="__codelineno-21-125" name="__codelineno-21-125" href="#__codelineno-21-125"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-21-126" name="__codelineno-21-126" href="#__codelineno-21-126"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-21-127" name="__codelineno-21-127" href="#__codelineno-21-127"></a><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">que_size</span><span class="w"> </span><span class="o">-=</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span><span class="w"> </span><span class="c1">// 更新队列长度</span>
<a id="__codelineno-21-128" name="__codelineno-21-128" href="#__codelineno-21-128"></a><span class="w"> </span><span class="n">Rc</span>::<span class="n">try_unwrap</span><span class="p">(</span><span class="n">old_rear</span><span class="p">).</span><span class="n">ok</span><span class="p">().</span><span class="n">unwrap</span><span class="p">().</span><span class="n">into_inner</span><span class="p">().</span><span class="n">val</span>
<a id="__codelineno-21-129" name="__codelineno-21-129" href="#__codelineno-21-129"></a><span class="w"> </span><span class="p">})</span>
<a id="__codelineno-21-130" name="__codelineno-21-130" href="#__codelineno-21-130"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-21-131" name="__codelineno-21-131" href="#__codelineno-21-131"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-21-132" name="__codelineno-21-132" href="#__codelineno-21-132"></a>
<a id="__codelineno-21-133" name="__codelineno-21-133" href="#__codelineno-21-133"></a><span class="w"> </span><span class="cm">/* 队首出队 */</span>
<a id="__codelineno-21-134" name="__codelineno-21-134" href="#__codelineno-21-134"></a><span class="w"> </span><span class="k">pub</span><span class="w"> </span><span class="k">fn</span> <span class="nf">pop_first</span><span class="p">(</span><span class="o">&amp;</span><span class="k">mut</span><span class="w"> </span><span class="bp">self</span><span class="p">)</span><span class="w"> </span>-&gt; <span class="nb">Option</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-21-135" name="__codelineno-21-135" href="#__codelineno-21-135"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">pop</span><span class="p">(</span><span class="kc">true</span><span class="p">);</span>
<a id="__codelineno-21-136" name="__codelineno-21-136" href="#__codelineno-21-136"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-21-137" name="__codelineno-21-137" href="#__codelineno-21-137"></a>
<a id="__codelineno-21-138" name="__codelineno-21-138" href="#__codelineno-21-138"></a><span class="w"> </span><span class="cm">/* 队尾出队 */</span>
<a id="__codelineno-21-139" name="__codelineno-21-139" href="#__codelineno-21-139"></a><span class="w"> </span><span class="k">pub</span><span class="w"> </span><span class="k">fn</span> <span class="nf">pop_last</span><span class="p">(</span><span class="o">&amp;</span><span class="k">mut</span><span class="w"> </span><span class="bp">self</span><span class="p">)</span><span class="w"> </span>-&gt; <span class="nb">Option</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-21-140" name="__codelineno-21-140" href="#__codelineno-21-140"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">pop</span><span class="p">(</span><span class="kc">false</span><span class="p">);</span>
<a id="__codelineno-21-141" name="__codelineno-21-141" href="#__codelineno-21-141"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-21-142" name="__codelineno-21-142" href="#__codelineno-21-142"></a>
<a id="__codelineno-21-143" name="__codelineno-21-143" href="#__codelineno-21-143"></a><span class="w"> </span><span class="cm">/* 访问队首元素 */</span>
<a id="__codelineno-21-144" name="__codelineno-21-144" href="#__codelineno-21-144"></a><span class="w"> </span><span class="k">pub</span><span class="w"> </span><span class="k">fn</span> <span class="nf">peek_first</span><span class="p">(</span><span class="o">&amp;</span><span class="bp">self</span><span class="p">)</span><span class="w"> </span>-&gt; <span class="nb">Option</span><span class="o">&lt;&amp;</span><span class="n">Rc</span><span class="o">&lt;</span><span class="n">RefCell</span><span class="o">&lt;</span><span class="n">ListNode</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;&gt;&gt;&gt;</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-21-145" name="__codelineno-21-145" href="#__codelineno-21-145"></a><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">front</span><span class="p">.</span><span class="n">as_ref</span><span class="p">()</span>
<a id="__codelineno-21-146" name="__codelineno-21-146" href="#__codelineno-21-146"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-21-147" name="__codelineno-21-147" href="#__codelineno-21-147"></a>
<a id="__codelineno-21-148" name="__codelineno-21-148" href="#__codelineno-21-148"></a><span class="w"> </span><span class="cm">/* 访问队尾元素 */</span>
<a id="__codelineno-21-149" name="__codelineno-21-149" href="#__codelineno-21-149"></a><span class="w"> </span><span class="k">pub</span><span class="w"> </span><span class="k">fn</span> <span class="nf">peek_last</span><span class="p">(</span><span class="o">&amp;</span><span class="bp">self</span><span class="p">)</span><span class="w"> </span>-&gt; <span class="nb">Option</span><span class="o">&lt;&amp;</span><span class="n">Rc</span><span class="o">&lt;</span><span class="n">RefCell</span><span class="o">&lt;</span><span class="n">ListNode</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;&gt;&gt;&gt;</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-21-150" name="__codelineno-21-150" href="#__codelineno-21-150"></a><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">rear</span><span class="p">.</span><span class="n">as_ref</span><span class="p">()</span>
<a id="__codelineno-21-151" name="__codelineno-21-151" href="#__codelineno-21-151"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-21-152" name="__codelineno-21-152" href="#__codelineno-21-152"></a>
<a id="__codelineno-21-153" name="__codelineno-21-153" href="#__codelineno-21-153"></a><span class="w"> </span><span class="cm">/* 返回数组用于打印 */</span>
<a id="__codelineno-21-154" name="__codelineno-21-154" href="#__codelineno-21-154"></a><span class="w"> </span><span class="k">pub</span><span class="w"> </span><span class="k">fn</span> <span class="nf">to_array</span><span class="p">(</span><span class="o">&amp;</span><span class="bp">self</span><span class="p">,</span><span class="w"> </span><span class="n">head</span>: <span class="nb">Option</span><span class="o">&lt;&amp;</span><span class="n">Rc</span><span class="o">&lt;</span><span class="n">RefCell</span><span class="o">&lt;</span><span class="n">ListNode</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;&gt;&gt;&gt;</span><span class="p">)</span><span class="w"> </span>-&gt; <span class="nb">Vec</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-21-155" name="__codelineno-21-155" href="#__codelineno-21-155"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="nb">Some</span><span class="p">(</span><span class="n">node</span><span class="p">)</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">head</span><span class="w"> </span><span class="p">{</span>
<a id="__codelineno-21-156" name="__codelineno-21-156" href="#__codelineno-21-156"></a><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="k">mut</span><span class="w"> </span><span class="n">nums</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="bp">self</span><span class="p">.</span><span class="n">to_array</span><span class="p">(</span><span class="n">node</span><span class="p">.</span><span class="n">borrow</span><span class="p">().</span><span class="n">next</span><span class="p">.</span><span class="n">as_ref</span><span class="p">());</span>
<a id="__codelineno-21-157" name="__codelineno-21-157" href="#__codelineno-21-157"></a><span class="w"> </span><span class="n">nums</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">borrow</span><span class="p">().</span><span class="n">val</span><span class="p">);</span>
<a id="__codelineno-21-158" name="__codelineno-21-158" href="#__codelineno-21-158"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">nums</span><span class="p">;</span>
<a id="__codelineno-21-159" name="__codelineno-21-159" href="#__codelineno-21-159"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-21-160" name="__codelineno-21-160" href="#__codelineno-21-160"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nb">Vec</span>::<span class="n">new</span><span class="p">();</span>
<a id="__codelineno-21-161" name="__codelineno-21-161" href="#__codelineno-21-161"></a><span class="w"> </span><span class="p">}</span>
<a id="__codelineno-21-162" name="__codelineno-21-162" href="#__codelineno-21-162"></a><span class="p">}</span>
</code></pre></div>
</div>
<div class="tabbed-block">