package main

 import "fmt"

 type Object interface{}

 type Node struct {
data Object
next *Node
} type List struct {
headNode *Node
} func NewNode(data Object, next *Node) *Node {
return &Node{data, next}
} func (list *List) IsEmpty() bool {
return list.headNode == nil
} func (list *List) Add(node *Node) *List {
headNode := list.headNode
if headNode.next != nil {
node.next = headNode.next
}
headNode.next = node
return list
} func (list *List) Append(node *Node) *List {
if list.IsEmpty() {
list.headNode = node
return list
}
curNode := list.headNode
for curNode.next != nil {
curNode = curNode.next
}
curNode.next = node
return list
} func (list *List) Insert(index int, data Object) {
if (index >= && index < list.Length()) {
count :=
if !list.IsEmpty() {
curNode := list.headNode
for curNode != nil && count < index {
count++
curNode = curNode.next
}
node := NewNode(data, curNode.next)
curNode.next = node
}
}
} func (list *List) Remove(index int) {
if (index >= && index < list.Length()) {
count :=
if !list.IsEmpty() {
curNode := list.headNode
for curNode != nil && count < index- {
count++
curNode = curNode.next
}
curNode.next = curNode.next.next
}
}
} func PrintList(list *List) {
cur := list.headNode
for cur != nil {
fmt.Println(cur.data)
cur = cur.next
}
} func (list *List) Length() int {
var length int
curNode := list.headNode
for curNode != nil {
length++
curNode = curNode.next
}
return length
} func ReverseList(head *Node) *Node {
cur := head
var pre *Node = nil
for cur != nil {
pre, cur, cur.next = cur, cur.next, pre
}
return cur
} func main(){
fmt.Println("NewNode======================")
node := NewNode(, nil)
fmt.Println(node.data)
list := &List{node}
PrintList(list)
node2 := NewNode("a", nil)
list.Append(node2)
fmt.Println("Add======================")
PrintList(list)
node1 := NewNode(, nil)
list.Add(node1)
fmt.Println("Length======================")
PrintList(list)
fmt.Println(list.Length())
fmt.Println("Insert======================")
list.Insert(, )
PrintList(list)
fmt.Println("Remove======================")
list.Remove()
PrintList(list)
fmt.Println("ReverseList======================")
ReverseList(node)
PrintList(list)
}

golang实现单链表的更多相关文章

  1. golang构造单链表

    原文地址:http://www.niu12.com/article/47package main import "fmt" type ListNode struct { Value ...

  2. golang数据结构之单链表

    实现单链表的增删查改. 目录如下: singleLink.go package link import ( "fmt" ) //HeroNode 链表节点 type HeroNod ...

  3. 数据结构之单链表(golang版)

    线性表之单链表 package main //线性表中的链式存储结构 //第一个节点为头节点,并不真实保存数据,头节点基本代表了整个链表 import ( "fmt" ) type ...

  4. 时间复杂度分别为 O(n)和 O(1)的删除单链表结点的方法

    有一个单链表,提供了头指针和一个结点指针,设计一个函数,在 O(1)时间内删除该结点指针指向的结点. 众所周知,链表无法随机存储,只能从头到尾去遍历整个链表,遇到目标节点之后删除之,这是最常规的思路和 ...

  5. 单链表的C++实现(采用模板类)

    采用模板类实现的好处是,不用拘泥于特定的数据类型.就像活字印刷术,制定好模板,就可以批量印刷,比手抄要强多少倍! 此处不具体介绍泛型编程,还是着重叙述链表的定义和相关操作.  链表结构定义 定义单链表 ...

  6. Java实现单链表的各种操作

    Java实现单链表的各种操作 主要内容:1.单链表的基本操作 2.删除重复数据 3.找到倒数第k个元素   4.实现链表的反转   5.从尾到头输出链表 6.找到中间节点 7.检测链表是否有环 8.在 ...

  7. [LeetCode] Linked List Cycle II 单链表中的环之二

    Given a linked list, return the node where the cycle begins. If there is no cycle, return null. Foll ...

  8. c++单链表基本功能

    head_LinkNode.h /*单链表类的头文件*/#include<assert.h>#include"compare.h"typedef int status; ...

  9. 单链表、循环链表的JS实现

    数据结构系列前言: 数据结构作为程序员的基本知识,需要我们每个人牢牢掌握.近期我也展开了对数据结构的二次学习,来弥补当年挖的坑......   当时上课的时候也就是跟着听课,没有亲自实现任何一种数据结 ...

随机推荐

  1. SpringBoot#应用启动后执行某些逻辑

    // 方式1 @Component public class WhenStartupA implements InitializingBean { @Override public void afte ...

  2. tp5日志分表

    /** * 记录网站日志 * * @return bool */ public function record() { // 组装数据 $log = self::$param; $log[self:: ...

  3. 0108 spring的申明式事务

    背景 互联网的金融和电商行业,最关注数据库事务. 业务核心 说明 金融行业-金融产品金额 不允许发生错误 电商行业-商品交易金额,商品库存 不允许发生错误 面临的难点: 高并发下保证: 数据一致性,高 ...

  4. Python中基于Unpacking与Packing进行分割,组合操作的嵌套元组数据结构的应用

    对于二叉树,图等,Python可采用基于Packing与Unpacking形成的嵌套元组数据结构来模拟,这里Packing指,比如a=b,c则,a就成了一个包含b,c的元组,Unpacking是指,比 ...

  5. android studio3.1 添加闪屏页面(启动欢迎界面)(例子简单无BUG)

    截图 启动页的 activity_splash.xml  我用了一张图片自己添加吧 <?xml version="1.0" encoding="utf-8" ...

  6. EditText标签的使用

    前文: 介绍EditText的使用,这个是文本输入控件,用来输入文本内容 使用: EditText继承TextView所以TextView的东西EditText都可以使用 text:显示文本 text ...

  7. C++ 检测物理内存以及磁盘空间

    BOOL CheckResource() { MEMORYSTATUSEX statex; statex.dwLength = sizeof (statex); GlobalMemoryStatusE ...

  8. VLC搭建RTSP服务器的过程

    第一步,打开VLC 第二步:在媒体下拉菜单下!有一个子菜单“串流”如图所示: 点击“串流”子菜单 弹出一个窗口!如下图所示. 添加一个你要串流的本地文件,我刚才传给你的那个长一点的文件. 第三步,会出 ...

  9. cf221 D. Little Elephant and Array

    题解真的是太神奇了2333 用离线和树状数组(为什么感觉和HH的项链是的,什么鬼),比较巧妙的是他把整个数列分成几段.用一个vector来记录每个数出现的位置.一共就是data[a[i]][sz]-- ...

  10. ORIGIN(起源属性)路由起源骗术

    ORIGIN(起源属性)配置: ①:抓取感兴趣流量——prefix.access ②:创建route-map 流量地图——permit 10 ③:匹配感兴趣流量——match ④:设置起源属性——se ...