教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 Golang学习日志 ━━ 单向链表

Golang学习日志 ━━ 单向链表

发布时间:2022-01-15   编辑:jiaochengji.com
教程集为您提供Golang学习日志 ━━ 单向链表等资源,欢迎您收藏本站,我们将为您提供最新的Golang学习日志 ━━ 单向链表资源
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"/></svg>

因为转载必须指明原文网址,而本文内容整合了网上多篇技术文章,无法明确其中一条,所以选择了原创。
<em>已在最后的参考目录里列出本文所有涉及的文章。</em>

<h2>定义</h2>

单向链表(单链表)是链表的一种,是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始;链表是由结点构成,head指针指向第一个成为表头结点,而终止于最后一个指向nuLL的指针。

<ul><li>链表是使用指针进行构造的列表;</li><li>又称为结点列表,因为链表是由一个个结点组装起来的;</li><li>其中每个结点都有指针成员变量指向列表中的下一个结点;</li></ul>

链表中的数据是以结点来表示的,每个结点的构成:

<blockquote>

元素(数据元素的映象) 指针(指示后继元素存储位置),

</blockquote> <ul><li>元素就是存储数据的存储单元,</li><li>指针就是连接每个结点的地址数据。</li></ul><h2>
优点</h2> <ul><li>单个结点创建非常方便,普通的线性内存通常在创建的时候就需要设定数据的大小</li><li>结点的删除非常方便,不需要像线性结构那样移动剩下的数据</li><li>结点的访问方便,可以通过循环或者递归的方法访问到任意数据,但是平均的访问效率低于线性表。</li></ul><h2>实现</h2> <blockquote>

简单说来,目的就是实现至少一个头指针记录开始的内存地址,此后每个元素都包含一个值和下一个元素的内存地址

</blockquote> <ol><li>相关结构体
首先需要先定义一下链表相关的结果,SingleObject用于每个节点的数据,为interface{}结构,SingleNode为链表中的节点,SingleList单链表,为了多协程读写安全,所以在链表中加了读写锁。</li></ol>

具体定义如下:

<pre><code class="lang-go hljs"><span class="token comment">// 节点数据</span> <span class="token keyword">type</span> SingleObject <span class="token keyword">interface</span><span class="token punctuation">{</span><span class="token punctuation">}</span> <span class="token comment">// 单链表节点</span> <span class="token keyword">type</span> SingleNode <span class="token keyword">struct</span> <span class="token punctuation">{</span> Data SingleObject Next <span class="token operator">*</span>SingleNode <span class="token punctuation">}</span> <span class="token comment">// 单链表</span> <span class="token keyword">type</span> SingleList <span class="token keyword">struct</span><span class="token punctuation">{</span> mutex <span class="token operator">*</span>sync<span class="token punctuation">.</span>RWMutex Head <span class="token operator">*</span>SingleNode Tail <span class="token operator">*</span>SingleNode Size <span class="token builtin">uint</span> <span class="token punctuation">}</span> </code></pre> <ol start="2"><li>链表初始化
定义完结构,接下来就需要对单链表进行初始化了。代码如下:</li></ol><pre><code class="lang-go hljs"><span class="token comment">// 初始化</span> <span class="token keyword">func</span> <span class="token punctuation">(</span>list <span class="token operator">*</span>SingleList<span class="token punctuation">)</span> <span class="token function">Init</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> list<span class="token punctuation">.</span>Size <span class="token operator">=</span> <span class="token number">0</span> list<span class="token punctuation">.</span>Head <span class="token operator">=</span> <span class="token boolean">nil</span> list<span class="token punctuation">.</span>Tail <span class="token operator">=</span> <span class="token boolean">nil</span> list<span class="token punctuation">.</span>mutex <span class="token operator">=</span> <span class="token function">new</span><span class="token punctuation">(</span>sync<span class="token punctuation">.</span>RWMutex<span class="token punctuation">)</span> <span class="token punctuation">}</span> </code></pre> <ol start="3"><li>新增节点
链表节点的新增分为两种,
a. append:在链表后面追加节点;
b. insert:在指定位置插入节点。</li></ol>

另外新增时,若为第一个节点需特殊处理一下。下面请看代码:

<pre><code class="lang-go hljs"><span class="token comment">// 添加节点到链表尾部</span> <span class="token keyword">func</span> <span class="token punctuation">(</span>list <span class="token operator">*</span>SingleList<span class="token punctuation">)</span><span class="token function">Append</span><span class="token punctuation">(</span>node <span class="token operator">*</span>SingleNode<span class="token punctuation">)</span> <span class="token builtin">bool</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> node <span class="token operator">==</span> <span class="token boolean">nil</span><span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token boolean">false</span> <span class="token punctuation">}</span> list<span class="token punctuation">.</span>mutex<span class="token punctuation">.</span><span class="token function">Lock</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">defer</span> list<span class="token punctuation">.</span>mutex<span class="token punctuation">.</span><span class="token function">Unlock</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">if</span> list<span class="token punctuation">.</span>Size <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">{</span> list<span class="token punctuation">.</span>Head <span class="token operator">=</span> node list<span class="token punctuation">.</span>Tail <span class="token operator">=</span> node list<span class="token punctuation">.</span>Size <span class="token operator">=</span> <span class="token number">1</span> <span class="token keyword">return</span> <span class="token boolean">true</span> <span class="token punctuation">}</span> tail <span class="token operator">:=</span> list<span class="token punctuation">.</span>Tail tail<span class="token punctuation">.</span>Next <span class="token operator">=</span> node list<span class="token punctuation">.</span>Tail <span class="token operator">=</span> node list<span class="token punctuation">.</span>Size <span class="token operator"> =</span> <span class="token number">1</span> <span class="token keyword">return</span> <span class="token boolean">true</span> <span class="token punctuation">}</span> <span class="token comment">// 插入节点到指定位置</span> <span class="token keyword">func</span> <span class="token punctuation">(</span>list <span class="token operator">*</span>SingleList<span class="token punctuation">)</span><span class="token function">Insert</span><span class="token punctuation">(</span>index <span class="token builtin">uint</span><span class="token punctuation">,</span> node <span class="token operator">*</span>SingleNode<span class="token punctuation">)</span> <span class="token builtin">bool</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> node <span class="token operator">==</span> <span class="token boolean">nil</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token boolean">false</span> <span class="token punctuation">}</span> <span class="token keyword">if</span> index <span class="token operator">></span> list<span class="token punctuation">.</span>Size<span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token boolean">false</span> <span class="token punctuation">}</span> list<span class="token punctuation">.</span>mutex<span class="token punctuation">.</span><span class="token function">Lock</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">defer</span> list<span class="token punctuation">.</span>mutex<span class="token punctuation">.</span><span class="token function">Unlock</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">if</span> index <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">{</span> node<span class="token punctuation">.</span>Next <span class="token operator">=</span> list<span class="token punctuation">.</span>Head list<span class="token punctuation">.</span>Head <span class="token operator">=</span> node list<span class="token punctuation">.</span>Size <span class="token operator"> =</span> <span class="token number">1</span> <span class="token keyword">return</span> <span class="token boolean">true</span> <span class="token punctuation">}</span> <span class="token keyword">var</span> i <span class="token builtin">uint</span> ptr <span class="token operator">:=</span> list<span class="token punctuation">.</span>Head <span class="token keyword">for</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><</span> index<span class="token punctuation">;</span> i <span class="token operator"> </span> <span class="token punctuation">{</span> ptr <span class="token operator">=</span> ptr<span class="token punctuation">.</span>Next <span class="token punctuation">}</span> next <span class="token operator">:=</span> ptr<span class="token punctuation">.</span>Next ptr<span class="token punctuation">.</span>Next <span class="token operator">=</span> node node<span class="token punctuation">.</span>Next <span class="token operator">=</span> next list<span class="token punctuation">.</span>Size <span class="token operator"> =</span> <span class="token number">1</span> <span class="token keyword">return</span> <span class="token boolean">true</span> <span class="token punctuation">}</span> </code></pre> <ol start="4"><li>删除节点
有了新增功能自然就少不了删除,此外,删除节点时,如果指定的位置是链表的头部或尾部,都需要特殊处理下。</li></ol>

看代码:

<pre><code class="lang-go hljs"><span class="token comment">// 删除指定位置的节点</span> <span class="token keyword">func</span> <span class="token punctuation">(</span>list <span class="token operator">*</span>SingleList<span class="token punctuation">)</span><span class="token function">Delete</span><span class="token punctuation">(</span>index <span class="token builtin">uint</span><span class="token punctuation">)</span> <span class="token builtin">bool</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> list <span class="token operator">==</span> <span class="token boolean">nil</span> <span class="token operator">||</span> list<span class="token punctuation">.</span>Size <span class="token operator">==</span> <span class="token number">0</span> <span class="token operator">||</span> index <span class="token operator">></span> list<span class="token punctuation">.</span>Size <span class="token operator">-</span> <span class="token number">1</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token boolean">false</span> <span class="token punctuation">}</span> list<span class="token punctuation">.</span>mutex<span class="token punctuation">.</span><span class="token function">Lock</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">defer</span> list<span class="token punctuation">.</span>mutex<span class="token punctuation">.</span><span class="token function">Unlock</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">if</span> index <span class="token operator">==</span> <span class="token number">0</span> <span class="token punctuation">{</span> head <span class="token operator">:=</span> list<span class="token punctuation">.</span>Head<span class="token punctuation">.</span>Next list<span class="token punctuation">.</span>Head <span class="token operator">=</span> head <span class="token keyword">if</span> list<span class="token punctuation">.</span>Size <span class="token operator">==</span> <span class="token number">1</span><span class="token punctuation">{</span> list<span class="token punctuation">.</span>Tail <span class="token operator">=</span> <span class="token boolean">nil</span> <span class="token punctuation">}</span> list<span class="token punctuation">.</span>Size <span class="token operator">-=</span> <span class="token number">1</span> <span class="token keyword">return</span> <span class="token boolean">true</span> <span class="token punctuation">}</span> ptr <span class="token operator">:=</span> list<span class="token punctuation">.</span>Head <span class="token keyword">var</span> i <span class="token builtin">uint</span> <span class="token keyword">for</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><</span> index<span class="token punctuation">;</span> i<span class="token operator"> </span><span class="token punctuation">{</span> ptr <span class="token operator">=</span> ptr<span class="token punctuation">.</span>Next <span class="token punctuation">}</span> next <span class="token operator">:=</span> ptr<span class="token punctuation">.</span>Next ptr<span class="token punctuation">.</span>Next <span class="token operator">=</span> next<span class="token punctuation">.</span>Next <span class="token keyword">if</span> index <span class="token operator">==</span> list<span class="token punctuation">.</span>Size <span class="token operator">-</span> <span class="token number">1</span> <span class="token punctuation">{</span> list<span class="token punctuation">.</span>Tail <span class="token operator">=</span> ptr <span class="token punctuation">}</span> list<span class="token punctuation">.</span>Size <span class="token operator">-=</span> <span class="token number">1</span> <span class="token keyword">return</span> <span class="token boolean">true</span> <span class="token punctuation">}</span> </code></pre> <ol start="5"><li>查询节点
根据指定的位置索引,查询出节点内容。</li></ol><pre><code class="lang-go hljs"><span class="token comment">// 获取指定位置的节点,不存在则返回nil</span> <span class="token keyword">func</span> <span class="token punctuation">(</span>list <span class="token operator">*</span>SingleList<span class="token punctuation">)</span><span class="token function">Get</span><span class="token punctuation">(</span>index <span class="token builtin">uint</span><span class="token punctuation">)</span> <span class="token operator">*</span>SingleNode<span class="token punctuation">{</span> <span class="token keyword">if</span> list <span class="token operator">==</span> <span class="token boolean">nil</span> <span class="token operator">||</span> list<span class="token punctuation">.</span>Size <span class="token operator">==</span> <span class="token number">0</span> <span class="token operator">||</span> index <span class="token operator">></span> list<span class="token punctuation">.</span>Size <span class="token operator">-</span> <span class="token number">1</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token boolean">nil</span> <span class="token punctuation">}</span> list<span class="token punctuation">.</span>mutex<span class="token punctuation">.</span><span class="token function">RLock</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">defer</span> list<span class="token punctuation">.</span>mutex<span class="token punctuation">.</span><span class="token function">RUnlock</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">if</span> index <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">{</span> <span class="token keyword">return</span> list<span class="token punctuation">.</span>Head <span class="token punctuation">}</span> node <span class="token operator">:=</span> list<span class="token punctuation">.</span>Head <span class="token keyword">var</span> i <span class="token builtin">uint</span> <span class="token keyword">for</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> index<span class="token punctuation">;</span> i <span class="token operator"> </span> <span class="token punctuation">{</span> node <span class="token operator">=</span> node<span class="token punctuation">.</span>Next <span class="token punctuation">}</span> <span class="token keyword">return</span> node <span class="token punctuation">}</span> </code></pre> <ol start="6"><li>打印链表
最后,我们增加一个打印链表的功能,方便我们看整个链表的内容:</li></ol><pre><code class="lang-go hljs"><span class="token comment">// 输出链表</span> <span class="token keyword">func</span> <span class="token punctuation">(</span>list <span class="token operator">*</span>SingleList<span class="token punctuation">)</span><span class="token function">Display</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span> <span class="token keyword">if</span> list <span class="token operator">==</span> <span class="token boolean">nil</span> <span class="token punctuation">{</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"this single list is nil"</span><span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token punctuation">}</span> list<span class="token punctuation">.</span>mutex<span class="token punctuation">.</span><span class="token function">RLock</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">defer</span> list<span class="token punctuation">.</span>mutex<span class="token punctuation">.</span><span class="token function">RUnlock</span><span class="token punctuation">(</span><span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"this single list size is %d \n"</span><span class="token punctuation">,</span> list<span class="token punctuation">.</span>Size<span class="token punctuation">)</span> ptr <span class="token operator">:=</span> list<span class="token punctuation">.</span>Head <span class="token keyword">var</span> i <span class="token builtin">uint</span> <span class="token keyword">for</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> list<span class="token punctuation">.</span>Size<span class="token punctuation">;</span> i<span class="token operator"> </span><span class="token punctuation">{</span> fmt<span class="token punctuation">.</span><span class="token function">Printf</span><span class="token punctuation">(</span><span class="token string">"No= data is %v\n"</span><span class="token punctuation">,</span> i <span class="token operator"> </span> <span class="token number">1</span><span class="token punctuation">,</span> ptr<span class="token punctuation">.</span>Data<span class="token punctuation">)</span> ptr <span class="token operator">=</span> ptr<span class="token punctuation">.</span>Next <span class="token punctuation">}</span> <span class="token punctuation">}</span> </code></pre> <h2>
完整实例</h2> <pre><code class="lang-go hljs"><span class="token keyword">package</span> main <span class="token keyword">import</span> <span class="token string">"fmt"</span> <span class="token keyword">type</span> Object <span class="token keyword">interface</span><span class="token punctuation">{</span><span class="token punctuation">}</span> <span class="token keyword">type</span> Node <span class="token keyword">struct</span> <span class="token punctuation">{</span> Data Object next <span class="token operator">*</span>Node <span class="token punctuation">}</span> <span class="token keyword">type</span> List <span class="token keyword">struct</span> <span class="token punctuation">{</span> size <span class="token builtin">uint64</span> head <span class="token operator">*</span>Node tail <span class="token operator">*</span>Node <span class="token punctuation">}</span> <span class="token keyword">func</span> <span class="token punctuation">(</span>list <span class="token operator">*</span>List<span class="token punctuation">)</span> <span class="token function">Init</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token punctuation">(</span><span class="token operator">*</span>list<span class="token punctuation">)</span><span class="token punctuation">.</span>size <span class="token operator">=</span> <span class="token number">0</span> <span class="token punctuation">(</span><span class="token operator">*</span>list<span class="token punctuation">)</span><span class="token punctuation">.</span>head <span class="token operator">=</span> <span class="token boolean">nil</span> <span class="token punctuation">(</span><span class="token operator">*</span>list<span class="token punctuation">)</span><span class="token punctuation">.</span>tail <span class="token operator">=</span> <span class="token boolean">nil</span> <span class="token punctuation">}</span> <span class="token comment">// 向链表追加节点</span> <span class="token keyword">func</span> <span class="token punctuation">(</span>list <span class="token operator">*</span>List<span class="token punctuation">)</span> <span class="token function">Append</span><span class="token punctuation">(</span>node <span class="token operator">*</span>Node<span class="token punctuation">)</span> <span class="token builtin">bool</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> node <span class="token operator">==</span> <span class="token boolean">nil</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token boolean">false</span> <span class="token punctuation">}</span> <span class="token punctuation">(</span><span class="token operator">*</span>node<span class="token punctuation">)</span><span class="token punctuation">.</span>next <span class="token operator">=</span> <span class="token boolean">nil</span> <span class="token comment">// 新加节点在末尾,没有next</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">*</span>list<span class="token punctuation">)</span><span class="token punctuation">.</span>size <span class="token operator">==</span> <span class="token number">0</span> <span class="token punctuation">{</span> <span class="token punctuation">(</span><span class="token operator">*</span>list<span class="token punctuation">)</span><span class="token punctuation">.</span>head <span class="token operator">=</span> node <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> oldTail <span class="token operator">:=</span> <span class="token punctuation">(</span><span class="token operator">*</span>list<span class="token punctuation">)</span><span class="token punctuation">.</span>tail <span class="token comment">// 取尾结点</span> <span class="token punctuation">(</span><span class="token operator">*</span>oldTail<span class="token punctuation">)</span><span class="token punctuation">.</span>next <span class="token operator">=</span> node <span class="token comment">// 尾结点的next指向新加节点</span> <span class="token punctuation">}</span> <span class="token punctuation">(</span><span class="token operator">*</span>list<span class="token punctuation">)</span><span class="token punctuation">.</span>tail <span class="token operator">=</span> node <span class="token comment">// 新节点是尾结点</span> <span class="token punctuation">(</span><span class="token operator">*</span>list<span class="token punctuation">)</span><span class="token punctuation">.</span>size<span class="token operator"> </span> <span class="token keyword">return</span> <span class="token boolean">true</span> <span class="token punctuation">}</span> <span class="token comment">// 向第i个节点处插入节点</span> <span class="token keyword">func</span> <span class="token punctuation">(</span>list <span class="token operator">*</span>List<span class="token punctuation">)</span> <span class="token function">Insert</span><span class="token punctuation">(</span>i <span class="token builtin">uint64</span><span class="token punctuation">,</span> node <span class="token operator">*</span>Node<span class="token punctuation">)</span> <span class="token builtin">bool</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> node <span class="token operator">==</span> <span class="token boolean">nil</span> <span class="token operator">||</span> i <span class="token operator">></span> <span class="token punctuation">(</span><span class="token operator">*</span>list<span class="token punctuation">)</span><span class="token punctuation">.</span>size <span class="token operator">||</span> <span class="token punctuation">(</span><span class="token operator">*</span>list<span class="token punctuation">)</span><span class="token punctuation">.</span>size <span class="token operator">==</span> <span class="token number">0</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token boolean">false</span> <span class="token punctuation">}</span> <span class="token keyword">if</span> i <span class="token operator">==</span> <span class="token number">0</span> <span class="token punctuation">{</span> <span class="token punctuation">(</span><span class="token operator">*</span>node<span class="token punctuation">)</span><span class="token punctuation">.</span>next <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token operator">*</span>list<span class="token punctuation">)</span><span class="token punctuation">.</span>head <span class="token punctuation">(</span><span class="token operator">*</span>list<span class="token punctuation">)</span><span class="token punctuation">.</span>head <span class="token operator">=</span> node <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> preNode <span class="token operator">:=</span> <span class="token punctuation">(</span><span class="token operator">*</span>list<span class="token punctuation">)</span><span class="token punctuation">.</span>head <span class="token keyword">for</span> j <span class="token operator">:=</span> <span class="token function">uint64</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> j <span class="token operator"><</span> i<span class="token punctuation">;</span> j<span class="token operator"> </span> <span class="token punctuation">{</span> preNode <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token operator">*</span>preNode<span class="token punctuation">)</span><span class="token punctuation">.</span>next <span class="token punctuation">}</span> <span class="token punctuation">(</span><span class="token operator">*</span>node<span class="token punctuation">)</span><span class="token punctuation">.</span>next <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token operator">*</span>preNode<span class="token punctuation">)</span><span class="token punctuation">.</span>next <span class="token comment">// 新节点指向旧节点原来所指的next</span> <span class="token punctuation">(</span><span class="token operator">*</span>preNode<span class="token punctuation">)</span><span class="token punctuation">.</span>next <span class="token operator">=</span> node <span class="token comment">// 原节点的next指向新节点</span> <span class="token punctuation">}</span> <span class="token punctuation">(</span><span class="token operator">*</span>list<span class="token punctuation">)</span><span class="token punctuation">.</span>size<span class="token operator"> </span> <span class="token keyword">return</span> <span class="token boolean">true</span> <span class="token punctuation">}</span> <span class="token comment">// 移除指定位置的节点</span> <span class="token keyword">func</span> <span class="token punctuation">(</span>list <span class="token operator">*</span>List<span class="token punctuation">)</span> <span class="token function">Remove</span><span class="token punctuation">(</span>i <span class="token builtin">uint64</span><span class="token punctuation">)</span> <span class="token builtin">bool</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> i <span class="token operator">>=</span> <span class="token punctuation">(</span><span class="token operator">*</span>list<span class="token punctuation">)</span><span class="token punctuation">.</span>size <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token boolean">false</span> <span class="token punctuation">}</span> <span class="token keyword">if</span> i <span class="token operator">==</span> <span class="token number">0</span> <span class="token punctuation">{</span> preHead <span class="token operator">:=</span> <span class="token punctuation">(</span><span class="token operator">*</span>list<span class="token punctuation">)</span><span class="token punctuation">.</span>head <span class="token comment">// 取出旧的链表头</span> <span class="token punctuation">(</span><span class="token operator">*</span>list<span class="token punctuation">)</span><span class="token punctuation">.</span>head <span class="token operator">=</span> preHead<span class="token punctuation">.</span>next <span class="token comment">// 旧链表头的next变为新的头</span> <span class="token comment">// 如果仅有一个节点,则头尾节点清空</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">*</span>list<span class="token punctuation">)</span><span class="token punctuation">.</span>size <span class="token operator">==</span> <span class="token number">1</span> <span class="token punctuation">{</span> <span class="token punctuation">(</span><span class="token operator">*</span>list<span class="token punctuation">)</span><span class="token punctuation">.</span>head <span class="token operator">=</span> <span class="token boolean">nil</span> <span class="token punctuation">(</span><span class="token operator">*</span>list<span class="token punctuation">)</span><span class="token punctuation">.</span>tail <span class="token operator">=</span> <span class="token boolean">nil</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> preNode <span class="token operator">:=</span> <span class="token punctuation">(</span><span class="token operator">*</span>list<span class="token punctuation">)</span><span class="token punctuation">.</span>head <span class="token keyword">for</span> j <span class="token operator">:=</span> <span class="token function">uint64</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> j <span class="token operator"><</span> i<span class="token punctuation">;</span> j<span class="token operator"> </span> <span class="token punctuation">{</span> preNode <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token operator">*</span>preNode<span class="token punctuation">)</span><span class="token punctuation">.</span>next <span class="token punctuation">}</span> node <span class="token operator">:=</span> <span class="token punctuation">(</span><span class="token operator">*</span>preNode<span class="token punctuation">)</span><span class="token punctuation">.</span>next <span class="token comment">// 找到当前要删除的节点</span> <span class="token punctuation">(</span><span class="token operator">*</span>preNode<span class="token punctuation">)</span><span class="token punctuation">.</span>next <span class="token operator">=</span> node<span class="token punctuation">.</span>next <span class="token comment">// 把当前要删除节点的next赋给其父节点的next,完成后代转移</span> <span class="token comment">// 若删除的尾部,尾部指针需要调整</span> <span class="token keyword">if</span> i <span class="token operator">==</span> <span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token operator">*</span>list<span class="token punctuation">)</span><span class="token punctuation">.</span>size <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token punctuation">(</span><span class="token operator">*</span>list<span class="token punctuation">)</span><span class="token punctuation">.</span>tail <span class="token operator">=</span> preNode <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">(</span><span class="token operator">*</span>list<span class="token punctuation">)</span><span class="token punctuation">.</span>size<span class="token operator">--</span> <span class="token keyword">return</span> <span class="token boolean">true</span> <span class="token punctuation">}</span> <span class="token comment">// 移除所有节点</span> <span class="token keyword">func</span> <span class="token punctuation">(</span>list <span class="token operator">*</span>List<span class="token punctuation">)</span> <span class="token function">RemoveAll</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token builtin">bool</span> <span class="token punctuation">{</span> <span class="token punctuation">(</span><span class="token operator">*</span>list<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">Init</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token boolean">true</span> <span class="token punctuation">}</span> <span class="token comment">// 获取指定位置的节点</span> <span class="token keyword">func</span> <span class="token punctuation">(</span>list <span class="token operator">*</span>List<span class="token punctuation">)</span> <span class="token function">Get</span><span class="token punctuation">(</span>i <span class="token builtin">uint64</span><span class="token punctuation">)</span> <span class="token operator">*</span>Node <span class="token punctuation">{</span> <span class="token keyword">if</span> i <span class="token operator">>=</span> <span class="token punctuation">(</span><span class="token operator">*</span>list<span class="token punctuation">)</span><span class="token punctuation">.</span>size <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token boolean">nil</span> <span class="token punctuation">}</span> node <span class="token operator">:=</span> <span class="token punctuation">(</span><span class="token operator">*</span>list<span class="token punctuation">)</span><span class="token punctuation">.</span>head <span class="token keyword">for</span> j <span class="token operator">:=</span> <span class="token function">uint64</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span> j <span class="token operator"><</span> i<span class="token punctuation">;</span> j<span class="token operator"> </span> <span class="token punctuation">{</span> node <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token operator">*</span>node<span class="token punctuation">)</span><span class="token punctuation">.</span>next <span class="token punctuation">}</span> <span class="token keyword">return</span> node <span class="token punctuation">}</span> <span class="token comment">// 搜索某个数据的节点位置</span> <span class="token keyword">func</span> <span class="token punctuation">(</span>list <span class="token operator">*</span>List<span class="token punctuation">)</span> <span class="token function">IndexOf</span><span class="token punctuation">(</span>data Object<span class="token punctuation">)</span> <span class="token builtin">int64</span> <span class="token punctuation">{</span> pos <span class="token operator">:=</span> <span class="token function">int64</span><span class="token punctuation">(</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span> node <span class="token operator">:=</span> <span class="token punctuation">(</span><span class="token operator">*</span>list<span class="token punctuation">)</span><span class="token punctuation">.</span>head <span class="token keyword">if</span> node<span class="token punctuation">.</span>Data <span class="token operator">==</span> data <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token number">0</span> <span class="token punctuation">}</span> <span class="token keyword">for</span> j <span class="token operator">:=</span> <span class="token function">uint64</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> j <span class="token operator"><</span> <span class="token punctuation">(</span><span class="token operator">*</span>list<span class="token punctuation">)</span><span class="token punctuation">.</span>size<span class="token punctuation">;</span> j<span class="token operator"> </span> <span class="token punctuation">{</span> <span class="token keyword">if</span> node <span class="token operator">!=</span> <span class="token boolean">nil</span> <span class="token punctuation">{</span> node <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token operator">*</span>node<span class="token punctuation">)</span><span class="token punctuation">.</span>next <span class="token keyword">if</span> node <span class="token operator">!=</span> <span class="token boolean">nil</span> <span class="token operator">&&</span> node<span class="token punctuation">.</span>Data <span class="token operator">==</span> data <span class="token punctuation">{</span> pos <span class="token operator">=</span> <span class="token function">int64</span><span class="token punctuation">(</span>j<span class="token punctuation">)</span> <span class="token keyword">break</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> pos <span class="token punctuation">}</span> <span class="token comment">// 取得链表长度</span> <span class="token keyword">func</span> <span class="token punctuation">(</span>list <span class="token operator">*</span>List<span class="token punctuation">)</span> <span class="token function">GetSize</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token builtin">uint64</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">(</span><span class="token operator">*</span>list<span class="token punctuation">)</span><span class="token punctuation">.</span>size <span class="token punctuation">}</span> <span class="token comment">// 取得链表头</span> <span class="token keyword">func</span> <span class="token punctuation">(</span>list <span class="token operator">*</span>List<span class="token punctuation">)</span> <span class="token function">GetHead</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">*</span>Node <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">(</span><span class="token operator">*</span>list<span class="token punctuation">)</span><span class="token punctuation">.</span>head <span class="token punctuation">}</span> <span class="token comment">// 取得链表尾</span> <span class="token keyword">func</span> <span class="token punctuation">(</span>list <span class="token operator">*</span>List<span class="token punctuation">)</span> <span class="token function">GetTail</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">*</span>Node <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">(</span><span class="token operator">*</span>list<span class="token punctuation">)</span><span class="token punctuation">.</span>tail <span class="token punctuation">}</span> <span class="token keyword">func</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> l List l<span class="token punctuation">.</span><span class="token function">Init</span><span class="token punctuation">(</span><span class="token punctuation">)</span> node1 <span class="token operator">:=</span> <span class="token operator">&</span>Node<span class="token punctuation">{</span>Data<span class="token punctuation">:</span> <span class="token number">11111</span><span class="token punctuation">}</span> l<span class="token punctuation">.</span><span class="token function">Append</span><span class="token punctuation">(</span>node1<span class="token punctuation">)</span> node2 <span class="token operator">:=</span> <span class="token operator">&</span>Node<span class="token punctuation">{</span>Data<span class="token punctuation">:</span> <span class="token number">22222</span><span class="token punctuation">}</span> l<span class="token punctuation">.</span><span class="token function">Append</span><span class="token punctuation">(</span>node2<span class="token punctuation">)</span> node3 <span class="token operator">:=</span> <span class="token operator">&</span>Node<span class="token punctuation">{</span>Data<span class="token punctuation">:</span> <span class="token number">33333</span><span class="token punctuation">}</span> l<span class="token punctuation">.</span><span class="token function">Append</span><span class="token punctuation">(</span>node3<span class="token punctuation">)</span> node4 <span class="token operator">:=</span> <span class="token operator">&</span>Node<span class="token punctuation">{</span>Data<span class="token punctuation">:</span> <span class="token string">"insert"</span><span class="token punctuation">}</span> l<span class="token punctuation">.</span><span class="token function">Insert</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> node4<span class="token punctuation">)</span> node5 <span class="token operator">:=</span> <span class="token operator">&</span>Node<span class="token punctuation">{</span>Data<span class="token punctuation">:</span> <span class="token string">"head"</span><span class="token punctuation">}</span> l<span class="token punctuation">.</span><span class="token function">Insert</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> node5<span class="token punctuation">)</span> node6 <span class="token operator">:=</span> <span class="token operator">&</span>Node<span class="token punctuation">{</span>Data<span class="token punctuation">:</span> <span class="token string">"tail"</span><span class="token punctuation">}</span> l<span class="token punctuation">.</span><span class="token function">Append</span><span class="token punctuation">(</span>node6<span class="token punctuation">)</span> l<span class="token punctuation">.</span><span class="token function">Remove</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span> l<span class="token punctuation">.</span><span class="token function">Remove</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span> l<span class="token punctuation">.</span><span class="token function">Remove</span><span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">)</span> pos1 <span class="token operator">:=</span> l<span class="token punctuation">.</span><span class="token function">IndexOf</span><span class="token punctuation">(</span><span class="token number">22222</span><span class="token punctuation">)</span> pos2 <span class="token operator">:=</span> l<span class="token punctuation">.</span><span class="token function">IndexOf</span><span class="token punctuation">(</span><span class="token number">44444</span><span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>pos1<span class="token punctuation">,</span> pos2<span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>l<span class="token punctuation">.</span><span class="token function">GetHead</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> l<span class="token punctuation">.</span><span class="token function">GetTail</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> l<span class="token punctuation">.</span><span class="token function">GetSize</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment">//l.RemoveAll()</span> <span class="token keyword">for</span> i <span class="token operator">:=</span> <span class="token function">uint64</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span> i <span class="token operator"><</span> l<span class="token punctuation">.</span>size<span class="token punctuation">;</span> i<span class="token operator"> </span> <span class="token punctuation">{</span> fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span>l<span class="token punctuation">.</span><span class="token function">Get</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> </code></pre>

<iframe id="UvR38THC-1586659565861" src="https://player.bilibili.com/player.html?aid=92510911&page=128" allowfullscreen="true" data-mediaembed="bilibili"/>

Golang学习手册之:带你21周搞定Go语言

<h2>参考</h2>

《Golang学习手册之:带你21周搞定Go语言 - P128 128今日分享面试题》
《数据结构——Golang实现单链表 》
《golang 实现单链表》
《用golang实现的单向链表》
《golang 实现单链表 》
《Golang之单链表实现 》

到此这篇关于“Golang学习日志 ━━ 单向链表”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
golang日志服务器_深扒GO日志 | (一)从Go语言的日志包说起
golang 日志分析_每日一库之 logrus 日志使用教程
学习golang开始前的准备工作
GO语言-文件版日志系统
从零入门 Serverless | 函数计算的可观测性
从零入门Serverless|函数计算的可观测性
mysql 优化innodb_flush_log_at_trx_commit的案例介绍
mysql删除binlog日志及使用日志恢复数据的方法
零基础学习Go语言
golang url拆分出domain_回顾腾讯面试经历——golang后端开发岗位

[关闭]
~ ~