博客
关于我
【数据结构连载一线性表】【单向循环链表】golang
阅读量:472 次
发布时间:2019-03-06

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

package mainimport (	"fmt"	"strconv")type Node struct {	data  interface{}	next  *Node}type CycleLinkedList struct {	length  int	rear    *Node}func NewCycleLinkedList() *CycleLinkedList {	node := Node{}	l := CycleLinkedList{		length: 0,		rear:   &node,	}	l.rear.next = l.rear	return l}func (l *CycleLinkedList) Head() *Node {	return l.rear.next}func (l *CycleLinkedList) Tail() *Node {	return l.rear}func (l *CycleLinkedList) Length() int {	return l.length}func (l *CycleLinkedList) empty() bool {	return l.rear == l.rear.next}func (l *CycleLinkedList) exist(value interface{}) bool {	cur := l.rear.next	tail := l.rear	for {		if cur == tail {			return false		}		if cur.data == value {			return true		}		cur = cur.next	}}func (l *CycleLinkedList) Get(index int) interface{} {	n := 0	cur := l.rear.next	if index >= l.length {		return -1	}	tail := l.rear	for {		if tail == cur {			return -1		}		if n == index {			return cur.data		}		n++		cur = cur.next	}}func (l *CycleLinkedList) Add(value interface{}) {	cur := l.rear	newNode := Node{		data:  value,		next: cur.next,	}	cur.next = &newNode	l.length++}func (l *CycleLinkedList) Append(value interface{}) {	cur := l.rear	tail := l.rear	for {		if cur.next == tail {			break		}		cur = cur.next	}	newNode := Node{		data:  value,		next: cur.next,	}	cur.next = &newNode	l.length++}func (l *CycleLinkedList) Insert(index int, value interface{}) {	if index < 0 {		panic(fmt.Sprintf("位置插入不能为: %d", index))	}	newNode := Node{		data: value,	}	cur := l.rear	tail := l.rear	n := 0	for {		if cur.next == tail {			break		}		if n == index {			newNode.next = cur.next			cur.next = &newNode			l.length++			return		}		n++		cur = cur.next	}	newNode.next = cur.next	cur.next = &newNode	l.length++}func (l *CycleLinkedList) Index(value interface{}) int {	cur := l.rear.next	tail := l.rear	n := 0	for {		if cur == tail {			return -1		}		if cur.data == value {			return n		}		n++		cur = cur.next	}}func (l *CycleLinkedList) Delete(index int) {	if index >= l.length {		panic(fmt.Sprintf("下标不存在: %d", index))	}	cur := l.rear	tail := l.rear	n := 0	for {		if cur.next == tail {			panic(fmt.Sprintf("下标不存在: %d", index))		}		if n == index {			cur.next = cur.next.next			l.length--			break		}		n++		cur = cur.next	}}func (l *CycleLinkedList) Remove(value interface{}) {	cur := l.rear	tail := l.rear	for {		if cur.next == tail {			panic(fmt.Sprintf("数据不存在: %v", value))		}		if cur.next.data == value {			cur.next = cur.next.next			l.length--			break		}		cur = cur.next	}}func (l *CycleLinkedList) Pop() interface{} {	if l.length == 0 {		panic("链表为空")	}	cur := l.rear	tail := l.rear	for {		if cur.next.next == tail {			break		}	(cur = cur.next)}	data := cur.next.data	cur.next = cur.next.next	l.length--	return data}func (l *CycleLinkedList) Show() {	cur := l.rear.next	tail := l.rear	for {		if tail == cur {			break		}		fmt.Print(cur.data, " ")		cur = cur.next	}	fmt.Println()}func main() {	l := NewCycleLinkedList()	l.Add(10)	l.Add(9)	l.Add(8)	l.Append(7)	l.Insert(1, 19)	fmt.Println(l.Index(1))	l.Show()	l.Delete(3)	l.Remove(19)	l.Show()	fmt.Println(l.Pop())	fmt.Println(l.Pop())	l.Show()}

转载地址:http://eaxdz.baihongyu.com/

你可能感兴趣的文章
柏林噪声实践(二) 水与火,顶点纹理拾取
查看>>
如何写出一个性能优化的单例模式
查看>>
IntelliJ IDEA启动一个普通的java web项目的配置
查看>>
【程序员的脑洞故事】盘古,开辟天地
查看>>
《机器学习Python实现_10_06_集成学习_boosting_gbdt分类实现》
查看>>
分布式理论 PACELC 了解么?
查看>>
Java JFR 民间指南 - 事件详解 - jdk.ObjectAllocationSample
查看>>
对比讲解lambda表达式与传统接口函数实现方式
查看>>
真的简单,文本文件逐行处理–用java8 Stream流的方式
查看>>
使用java8API遍历过滤文件目录及子目录及隐藏文件
查看>>
精讲响应式WebClient第2篇-GET请求阻塞与非阻塞调用方法详解
查看>>
java9系列第二篇-资源自动关闭的语法增强
查看>>
Java9系列第九篇-对HTTP2协议的支持与非阻塞HTTP-API
查看>>
go语言系列--golang在windows上的安装和开发环境goland的配置
查看>>
jenkins-gitlab-harbor-ceph基于Kubernetes的CI/CD运用(一)
查看>>
go语言系统-从文件操作到单元测试
查看>>
Golang字符串是否存在于切片或数组中的小工具(基本等同于python in语法)
查看>>
CoreCLR源码探索(八) JIT的工作原理(详解篇)
查看>>
【数组】59. 螺旋矩阵 II
查看>>
【哈希表】1. 两数之和
查看>>