博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
单向链表 golang
阅读量:5335 次
发布时间:2019-06-15

本文共 2176 字,大约阅读时间需要 7 分钟。

package mainimport "fmt"type Object interface {}//节点type Node struct {	data Object    next *Node}//单向链表type List struct {	head *Node	tail *Node	size uint64} //初始化func(list *List) Init(){	(*list).size = 0    // 此时链表是空的	(*list).head = nil  // 没有头	(*list).tail = nil  // 没有尾}//向尾部添加数据func (list *List) Append(node *Node) bool {	if node == nil {		return false	}	(*node).next = nil	// 将新元素放入单链表中	if (*list).size == 0 {		(*list).head = node	} else {		oldTail := (*list).tail		(*oldTail).next = node	}	// 调整尾部位置,及链表元素数量	(*list).tail = node // node成为新的尾部	(*list).size++      // 元素数量增加	return true}//插入数据func (list *List) Insert(i uint64,node *Node) bool {	// 空的节点、索引超出范围和空链表都无法做插入操作	if node == nil || i > (*list).size || (*list).size == 0 {		return false	}	if i == 0 { // 直接排第一,也就领导小舅子才可以		(*node).next = (*list).head		(*list).head = node	} else {		// 找到前一个元素		preItem := (*list).head		for j := 1 ; uint64(j) < i; j++ { // 数前面i个元素			preItem = (*preItem).next		}		// 原来元素放到新元素后面,新元素放到前一个元素后面		(*node).next = (*preItem).next		(*preItem).next = preItem	}	(*list).size++	return true}//删除元素func (list *List) Remove(i uint64, node *Node) bool {	if i >= (*list).size {		return false	}	if i == 0 { // 删除头部		node = (*list).head		(*list).head = (*node).next		if (*list).size == 1 { // 如果只有一个元素,那尾部也要调整			(*list).tail = nil		}	} else {		preItem := (*list).head		for  j  := 1; uint64(j) < i; j++ {			preItem = (*preItem).next		}		node = (*preItem).next		(*preItem).next = (*node).next		if i == ((*list).size - 1) { // 若删除的尾部,尾部指针需要调整			(*list).tail = preItem		}	}	(*list).size--	return true}//获取元素func (list *List) Get(i uint64) *Node {	if i >= (*list).size {		return nil	}	item := (*list).head	for j := 0; uint64(j) < i ; j++ {    // 从head数i个		item = (*item).next	}	return item}func main(){	var list= List{}	list.Init()	for i:=1;i<100 ;i++  {		var node=Node{data:i}		list.Append(&node)	}	var node=list.Get(35)    fmt.Printf("当前节点位置:%+q \n,数据:%d \n",node,node.data)    var deleteNode=&Node{}   var result=list.Remove(35,deleteNode)   fmt.Printf("删除是否成功%+q \n",result)	var node2=list.Get(35)	fmt.Printf("当前节点位置:%+q \n,数据:%d \n",node2,node2.data)}

  

转载于:https://www.cnblogs.com/gbat/p/8303358.html

你可能感兴趣的文章
python基本数据类型
查看>>
1305: [CQOI2009]dance跳舞 - BZOJ
查看>>
关于TDD的思考
查看>>
Cocos2d-x学习之windows 7 android环境搭建
查看>>
将html代码中的大写标签转换成小写标签
查看>>
jmeter多线程组间的参数传递
查看>>
零散笔记
查看>>
第1章2节《MonkeyRunner源码剖析》概述:边界(原创)
查看>>
ubuntu16下面 redis 无法链接到客户端问题
查看>>
android下实现4分屏播放4路高清h264格式的rtsp流
查看>>
[计算机网络] vsftpd的安装与使用
查看>>
【源代码】LinkedList源代码分析
查看>>
Cocostudio学习笔记(4) LoadingBar+ TextField
查看>>
cxf和jboss eap 6.2版本号冲突
查看>>
ORACLE触发器具体解释
查看>>
IOS开发之SVN的使用
查看>>
Python学习之元组
查看>>
第三次作业
查看>>
quartz多任务调度+spring 实现
查看>>
Codeforces 97.B Superset
查看>>