文档章节

Go做复杂的单向链表

SunnyGo
 SunnyGo
发布于 2016/07/18 16:28
字数 843
阅读 9
收藏 1

有一个任务需要用到Go的单向链表,我查了一下没有找到合适的,所以自己写了一个。

我先说一下我的情况,我需要把菜单分级排序,也就是第一级下面紧跟着自己的子菜单。

首先先把菜单的所有项按照Id和Level数序拍好,也就是一级的都放在最上面,紧接着跟着2级的,2级的下面是3级的,以此类推。

先看一下数据结构

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

下面是我写的类,用于插入节点、取得节点长度、取得第一个节点,取得最后一个节点。

首先看一下节点的结构

type Node struct {
	Data SunnyNavigation
	Next *Node
}

具体代码如下:

package singlechain

import (
	"fmt"
)

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

//节点结构
type Node struct {
	Data SunnyNavigation
	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() {
	var snArray []singlechain.SunnyNavigation
	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
粉丝 7
博文 28
码字总数 8249
作品 0
东城
技术主管
私信 提问
Java容器类框架分析(2)LinkedList源码分析

概述 在分析LinkedList的源码之前,先看一下ArrayList在数据结构中的位置,常见的数据结构按照逻辑结构跟存储结构可以做如下划分: 数据结构分类 先看看源码的注释: Doubly-linked list imp...

wustor
2017/11/06
0
0
数据结构之链表与数组(2):单向链表上的简单操作问题

原文出处:写代码的李纳 本文主要介绍一些解决单向链表上部分操作问题的思路和代码实现。 主要的问题包括以下几点: 向单向链表中插入一个节点 删除单向链表中的一个节点 查找单向链表中的一...

写代码的李纳
2015/11/11
0
0
算法题详解:Remove The Kth Last Element From a List 从一个单向链表中删除倒数第K个节点

本视频来自于北美CS刷题神器BitTiger Pro。 相信大家在学习链表的时候都会学习删除某个节点,一般的情况都是说删除值等于某个给定值的节点,那个其实比较简单,今天我们来讨论一个稍微复杂一...

Ray Cao
2018/01/17
0
0
Java集合,LinkedList底层实现和原理

概述 文章的内容基于JDK1.7进行分析,之所以选用这个版本,是因为1.8的有些类做了改动,增加了阅读的难度,虽然是1.7,但是对于1.8做了重大改动的内容,文章也会进行说明。 LinkedList类是L...

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

本文首发于我的个人博客:尾尾部落 链表是面试过程中经常被问到的,这里把剑指offer 和 LeetCode 中的相关题目做一个汇总,方便复习。 1. 在 O(1) 时间删除链表节点 题目描述:给定单向链表的...

繁著
2018/08/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

四、RabbitMQ3.7在CentOS7下的安装

安装依赖 sudo yum install -y gcc gcc-c++ glibc-devel make ncurses-devel openssl-devel autoconf java-1.8.0-openjdk-devel git 创建yum源 vi /etc/yum.repos.d/rabbitmq-erlang.repo [......

XuePeng77
今天
2
0
android 延长Toast的时长

示例:myToast(5000,"hello"); public void myToast(int showTime, String msg) { Toast hello = Toast.makeText(getActivity(), msg, Toast.LENGTH_SHORT); new CountDownTimer(......

雨焰
昨天
4
0
浅谈mybatis的日志适配模式

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

算法之名
昨天
13
0
大数据教程(13.6)sqoop使用教程

上一章节,介绍了sqoop数据迁移工具安装以及简单导入实例的相关知识;本篇博客,博主将继续为小伙伴们分享sqoop的使用。 一、sqoop数据导入 (1)、导入关系表到HIVE ./sqoop import --connect...

em_aaron
昨天
3
0
Git cherry-pick 使用总结

应用背景:假设现在有两个分支:dev_01, dev_02. 如果我想把dev_01分支上的某几个commit合并到dev_02分支, 那么怎么办呢? 这就是cherry-pick的工作了。cherry-pick会捡选某些commit, 即把某...

天王盖地虎626
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部