链表

type Student struct {
Name string
Next* Student
}

每个节点包含下一个节点的地址,这样把所有的节点串起来了,通常把链表中的第一个节点叫做链表头

package main

import (
"fmt"
) type Student struct {
Id int
Name string
Age int
next *Student
} func trans(p *Student){
for p != nil {
fmt.Println(*p)
p = p.next
}
fmt.Println()
} func main() {
var head Student
head.Id = 0
head.Name = "head"
head.Age = 18 var s1 Student
s1.Id = 1
s1.Name = "stu1"
s1.Age = 20
head.next=&s1 var s2 Student
s2.Id = 2
s2.Name = "stu2"
s2.Age = 20
s1.next=&s2
trans(&head) var s3 Student
s3.Id = 3
s3.Name = "stu3"
s3.Age = 20
s2.next=&s3
trans(&head)
}

插入节点:尾部插入

package main

import (
"fmt"
"math/rand"
) type Student struct {
Id int
Name string
Age int
next *Student
} func trans(p *Student){
for p != nil {
fmt.Println(*p)
p = p.next
}
fmt.Println()
} func insertTail(p *Student) {
var tail = p
for i := 0; i < 10; i++ {
stu := Student{
Id: rand.Intn(10),
Name: fmt.Sprintf("stu%d", i),
Age: rand.Intn(100),
}
tail.next = &stu
tail = &stu
}
} func main() {
var head Student
head.Id = 0
head.Name = "head"
head.Age = 18
insertTail(&head)
trans(&head)
}

插入节点:头部插入

package main

import (
"fmt"
"math/rand"
) type Student struct {
Id int
Name string
Age int
next *Student
} func trans(p *Student){
for p != nil {
fmt.Println(*p)
p = p.next
}
fmt.Println()
} func insertTail(p *Student) {
var tail = p
for i := 0; i < 10; i++ {
stu := Student{
Id: rand.Intn(10),
Name: fmt.Sprintf("stu%d", i),
Age: rand.Intn(100),
}
tail.next = &stu
tail = &stu
}
} func insertHead(p **Student) {
//var tail = p
for i := 0; i < 10; i++ {
stu := Student{
Id: rand.Intn(10),
Name: fmt.Sprintf("stu%d", i),
Age: rand.Intn(100),
}
stu.next = *p
*p = &stu
}
} func main() {
//var head *Student = &Student{}
var head *Student = new(Student)
head.Id = 0
head.Name = "head"
head.Age = 18
insertTail(head)
insertHead(&head)
trans(head)
}

添加和删除

package main

import (
"fmt"
) type Student struct {
Id int
Name string
Age int
next *Student
} func trans(p *Student) {
for p != nil {
fmt.Println(*p)
p = p.next
}
fmt.Println()
} func delNode(p *Student) {
var prev *Student = p
for p != nil {
if p.Id == 100 {
prev.next = p.next
break
}
prev = p
p = p.next
}
} func addNode(p *Student, newNode *Student) {
for p != nil {
if p.Name == "head" {
newNode.next = p.next
p.next = newNode
break
}
p = p.next
}
} func main() {
var head *Student = new(Student)
head.Id = 0
head.Name = "head"
head.Age = 18 var s1 Student
s1.Id = 1
s1.Name = "stu1"
s1.Age = 20
head.next=&s1 var s2 Student
s2.Id = 2
s2.Name = "stu2"
s2.Age = 20
s1.next=&s2 var newNode *Student = new(Student)
newNode.Name = "greg"
newNode.Age = 18
newNode.Id = 100 addNode(head, newNode)
trans(head) delNode(head)
trans(head)
}

双链表定义

type Student struct {
Name string
Next* Student
Prev* Student
}

如果有两个指针分别指向前一个节点和后一个节点,我们叫做双链表

二叉树

type Student struct {
Id int
Name string
left* Student
right* Student
}

如果每个节点有两个指针分别用来指向左子树和右子树,我们把这样的结构叫做二叉树

package main

import "fmt"

type Student struct {
Id int
Name string
Age int
left *Student
right *Student
} func trans(root *Student) {
if root == nil {
return
} //前序遍历
fmt.Println(root)
trans(root.left)
trans(root.right) //中序遍历
//trans(root.left)
//fmt.Println(root)
//trans(root.right) //后续遍历
//trans(root.left)
//trans(root.right)
//fmt.Println(root)
} func main() {
var root *Student = new(Student)
root.Id = 1
root.Name = "s1"
root.Age = 18 var left1 *Student = new(Student)
left1.Id = 2
left1.Name = "s2"
left1.Age = 18
root.left = left1 var right1 *Student = new(Student)
right1.Id = 4
right1.Name = "s4"
right1.Age = 18
root.right = right1 var left2 *Student = new(Student)
left2.Id = 3
left2.Name = "s3"
left2.Age = 18
left1.left = left2 trans(root)
}

用接口实现一个通用链表

package main

import "fmt"

type LinkNode struct {
data interface{}
next *LinkNode
} type Link struct {
head *LinkNode
tail *LinkNode
} func (p *Link) InsertHead(data interface{}) {
node := &LinkNode{
data: data,
next: nil,
} if p.tail == nil && p.head == nil {
p.tail = node
p.head = node
return
} node.next = p.head
p.head = node
} func (p *Link) InsertTail(data interface{}) {
node := &LinkNode{
data: data,
next: nil,
} if p.tail == nil && p.head == nil {
p.tail = node
p.head = node
return
} p.tail.next = node
p.tail = node
} func (p *Link) Trans() {
q := p.head
for q != nil {
fmt.Println(q.data)
q = q.next
}
} func main() {
var link Link
for i := 0; i < 10; i++ {
//intLink.InsertHead(i)
link.InsertTail(fmt.Sprintf("str %d", i))
}
link.Trans()
}

GO开发:链表的更多相关文章

  1. C 封装一个通用链表 和 一个简单字符串开发库

    引言 这里需要分享的是一个 简单字符串库和 链表的基库,代码也许用到特定技巧.有时候回想一下, 如果我读书的时候有人告诉我这些关于C开发的积淀, 那么会走的多直啊.刚参加工作的时候做桌面开发, 服务是 ...

  2. 《Windows内核安全与驱动开发》 3.2 内存与链表

    <Windows内核安全与驱动开发>阅读笔记 -- 索引目录 <Windows内核安全与驱动开发> 3.2 内存与链表 1. 尝试生成一个链表头并将其初始化. 2. 尝试向内存 ...

  3. 数据结构开发(10):Linux内核链表

    0.目录 1.老生常谈的两个宏(Linux) 1.1 offsetof 1.2 container_of 2.Linux内核链表剖析 3.小结 1.老生常谈的两个宏(Linux) Linux 内核中常 ...

  4. NX二次开发-UFUN链表UF_MODL_create_list等用法

    NX9+VS2012 #include <uf.h> #include <uf_modl.h> #include <uf_curve.h> #include < ...

  5. NX二次开发-UFUN删除链表函数UF_MODL_delete_list

    NX9+VS2012 #include <uf.h> #include <uf_modl.h> #include <uf_obj.h> #include <u ...

  6. Java开发中的23种设计模式详解

    [放弃了原文访问者模式的Demo,自己写了一个新使用场景的Demo,加上了自己的理解] [源码地址:https://github.com/leon66666/DesignPattern] 一.设计模式 ...

  7. C语言可以开发哪些项目?

    C语言是我们大多数人的编程入门语言,对其也再熟悉不过了,不过很多初学者在学习的过程中难免会出现迷茫,比如:不知道C语言可以开发哪些项目,可以应用在哪些实际的开发中--,这些迷茫也导致了我们在学习的过程 ...

  8. .NET全栈开发工程师学习路径

    PS:最近一直反复地看博客园以前发布的一条.NET全栈开发工程师的招聘启事,觉得这是我看过最有创意也最朴实的一个招聘启事,更为重要的是它更像是一个技术提纲,能够指引我们的学习和提升,现在转载过来与各位 ...

  9. Java开发中的23种设计模式详解(转)

    设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

随机推荐

  1. 初识linux内核漏洞利用

    0x00 简介 之前只接触过应用层的漏洞利用, 这次第一次接触到内核层次的,小结一下. 0x01 概况 这次接触到的,是吾爱破解挑战赛里的一个题,给了一个有问题的驱动程序,要求在ubuntu 14.0 ...

  2. 2.flask模板--jinja2

    1.jinja2模板介绍和查找路径 import os from flask import Flask, render_template # 之前提到过在渲染模板的时候,默认会从项目根目录下的temp ...

  3. mysql 存储过程(二)

    存储过程(Stored Procedure): 一组可编程的函数,是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行. 优点(为什 ...

  4. [易学易懂系列|rustlang语言|零基础|快速入门|(16)|代码组织与模块化]

    [易学易懂系列|rustlang语言|零基础|快速入门|(16)|代码组织与模块化] 实用知识 代码组织与模块化 我们知道,在现代软件开发的过程中,代码组织和模块化是应对复杂性的一种方式. 今天我们来 ...

  5. 【VUE】Vue 源码解析

    Vue 源码解析 Vue 的工作机制 在 new vue() 之后,Vue 会调用进行初始化,会初始化生命周期.事件.props.methods.data.computed和watch等.其中最重要的 ...

  6. k8sDeployment控制器

    简写为deploy,是k8s控制器的另一种实现,它构建于ReplicaSet之上,可为pod和rs资源提供声明式更新. deploy控制器资源的大部分功能均可通过调用rs来实现,同时,还增添了部分特性 ...

  7. CSS3动画实现高亮光弧效果,文字和图片(一闪而过)

    前言 好久没有写博客啦,高亮文字和图片一闪而过的特效,用CSS3来写 先看文字吧, 就上代码了 .shadow { /* 背景颜色线性渐变 */ /* 老式写法 */ /* linear为线性渐变,也 ...

  8. C#生成的后台文件 ***.vshost.exe

    vshost是visual studio宿主应用程序,vs运行调试时是打开的其实是这个文件,这个程序可以让vs跟踪调试信息.而exe则可以直接打开,vs不会跟踪任何这个文件的运行情况.只要引用的程序集 ...

  9. web前端_css02

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  10. ES6 Promise使用介绍

    1.什么是Promise Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大. 这么说可能不够直观的理解,看下面的两个例子 // callback回调函数 ...