## Go做复杂的单向链表 原

SunnyGo

``````type SunnyNavigation struct {
Id       int
Level    int
ParentId int
Name     string
}``````

``````type Node struct {
Next *Node
}``````

``````package singlechain

import (
"fmt"
)

Id       int
Level    int
ParentId int
Name     string
}

//节点结构
type Node struct {
Next *Node
}

var Chain Node

/*
* 返回第一个节点
* h 头结点
*/
func GetFirst() *Node {
h := &Chain
if h.Next == nil {
return nil
}
return h.Next
}

/*
* 返回最后一个节点
* h 头结点
*/
func GetLast() *Node {
h := &Chain
if h.Next == nil {
return nil
}
i := h
for i.Next != nil {
i = i.Next
if i.Next == nil {
return i
}
}
return nil
}

//取长度
func GetLength() int {
var i int = 0
n := &Chain
for n.Next != nil {
if n.Data.Name != "" {
fmt.Println("^^^^^^^^", n.Data.Id, n.Data.Level, n.Data.ParentId, n.Data.Name)
}

i++
n = n.Next
}
if n.Data.Name != "" {
fmt.Println("^^^^^^^^", n.Data.Id, n.Data.Level, n.Data.ParentId, n.Data.Name)
}
return i
}

//插入一个节点
//h: 头结点
//d:要插入的节点
//p:要插入的位置
func Insert(p SunnyNavigation) (result bool) {
node := &Chain
if node.Next == nil && GetLength() == 0 {
var mynode Node
mynode.Data = p
mynode.Next = nil
node.Next = &mynode
result = true
} else {
result = false
for node.Next != nil {
if node.Data.Id == p.ParentId {
//				fmt.Println("---------", p, node.Data.ParentId, node.Data.Name)
var mynode Node
mynode.Data = p
mynode.Next = node.Next
node.Next = &mynode
result = true
break
}
node = node.Next
if node.Next == nil {
var mynode Node
mynode.Data = p
mynode.Next = nil
node.Next = &mynode
result = true
break
}
}
}

return
}
``````

``````package main

import (
"fmt"

"./singlechain/"
)

func main() {
sn := singlechain.SunnyNavigation{1, 0, 0, "新闻管理"}
snArray = append(snArray, sn)
sn = singlechain.SunnyNavigation{52, 0, 0, "推荐新闻管理"}
snArray = append(snArray, sn)
sn = singlechain.SunnyNavigation{55, 0, 0, "频道管理"}
snArray = append(snArray, sn)
sn = singlechain.SunnyNavigation{57, 0, 0, "广告&友链管理"}
snArray = append(snArray, sn)
sn = singlechain.SunnyNavigation{49, 0, 0, "幻灯"}
snArray = append(snArray, sn)
sn = singlechain.SunnyNavigation{44, 0, 0, "系统管理"}
snArray = append(snArray, sn)
sn = singlechain.SunnyNavigation{2, 1, 1, "新闻添加"}
snArray = append(snArray, sn)
sn = singlechain.SunnyNavigation{3, 1, 1, "新闻列表"}
snArray = append(snArray, sn)
sn = singlechain.SunnyNavigation{45, 1, 44, "用户管理"}
snArray = append(snArray, sn)
sn = singlechain.SunnyNavigation{46, 1, 44, "用户组管理"}
snArray = append(snArray, sn)
sn = singlechain.SunnyNavigation{47, 1, 44, "权限管理"}
snArray = append(snArray, sn)
sn = singlechain.SunnyNavigation{48, 1, 44, "菜单管理"}
snArray = append(snArray, sn)
sn = singlechain.SunnyNavigation{51, 1, 49, "幻灯管理"}
snArray = append(snArray, sn)
sn = singlechain.SunnyNavigation{53, 1, 52, "推荐新闻列表"}
snArray = append(snArray, sn)
sn = singlechain.SunnyNavigation{54, 1, 52, "推荐分类列表"}
snArray = append(snArray, sn)
sn = singlechain.SunnyNavigation{56, 1, 55, "频道管理"}
snArray = append(snArray, sn)
sn = singlechain.SunnyNavigation{60, 1, 55, "城市信息管理"}
snArray = append(snArray, sn)
sn = singlechain.SunnyNavigation{58, 1, 57, "广告列表"}
snArray = append(snArray, sn)
sn = singlechain.SunnyNavigation{59, 1, 57, "友链的管理"}
snArray = append(snArray, sn)
sn = singlechain.SunnyNavigation{222, 1, 3, "新闻333"}
snArray = append(snArray, sn)
//	fmt.Println(snArray)
for _, sn := range snArray {
singlechain.Insert(sn)
}
fmt.Println("length---------", singlechain.GetLength())
d := singlechain.GetFirst()
fmt.Println(d.Data.Name)
d = singlechain.GetLast()
fmt.Println(d.Data.Name)

}
``````

^^^^^^^^ 52 0 0 推荐新闻管理
^^^^^^^^ 54 1 52 推荐分类列表
^^^^^^^^ 53 1 52 推荐新闻列表
^^^^^^^^ 1 0 0 新闻管理
^^^^^^^^ 3 1 1 新闻列表
^^^^^^^^ 222 1 3 新闻333
^^^^^^^^ 2 1 1 新闻添加

### SunnyGo

wustor
2017/11/06
0
0

2015/11/11
0
0

Ray Cao
2018/01/17
0
0

2018/02/27
0
0
[算法总结] 一文搞懂面试链表题

2018/08/28
0
0

XuePeng77

2
0
android 延长Toast的时长

4
0

Java开发中经常用到的日志框架有很多，Log4j、Log4j2、slf4j等等，Mybatis定义了一套统一的日志接口供上层使用，并为上述常用的日志框架提供了相应的适配器。有关适配器模式例子可以参考 设计...

13
0

em_aaron

3
0
Git cherry-pick 使用总结

9
0