golang 实现双向链表

package main

//链表节点
type doublLinkeNode struct {
	data interface{}     //节点存在的数据
	pre  *doublLinkeNode //指向上一个节点的指针
	next *doublLinkeNode //指向下一个节点的指针
}

//链表数据结构(两个指针 一个指向头节点、一个指向尾节点 便于可以从两边获取数据)
type doubleLink struct {
	head   *doublLinkeNode //指向头结点
	tail   *doublLinkeNode //指向尾节点
	length int64           //链表长度
}

//初始化链表
func initDoubleLink() (dl *doubleLink) {
	dl = &doubleLink{}
	dl.head = nil
	dl.tail = nil
	dl.length = 0
	return
}

//往链表的头部添加节点
func (this *doubleLink) addLNode(data interface{}) int64 {
	newNode := &doublLinkeNode{data: data}
	if this.length == 0 {
		this.head = newNode
		this.tail = newNode
	} else {
		head := this.head
		newNode.next = head
		head.pre = newNode
		this.head = newNode
	}
	this.length++
	return this.length
}

//往链表尾部添加节点
func (this *doubleLink) addRNode(data interface{}) int64 {
	newNode := &doublLinkeNode{data: data}
	if this.length == 0 {
		this.head = newNode
		this.tail = newNode

	} else {
		tail := this.tail //获取当前链表的尾节点
		tail.next = newNode
		newNode.pre = tail
		this.tail = newNode
	}
	this.length++
	return this.length
}

//遍历链表
func (this *doubleLink) rangeLink() []interface{} {
	if this.length == 0 {
		return nil
	}
	var list []interface{}
	node := this.head
	for {
		list = append(list, node.data)
		if node.next == nil {
			break
		} else {
			node = node.next
		}
	}
	return list
}

//获取某个位置的节点
func (this *doubleLink) getValue(index int64) interface{} {
	if this.length == 0 {
		return nil
	}
	node := this.head
	var count int64
	for {
		if count == index {
			return node.data
		}
		if node.next == nil {
			break
		}
		node = node.next
		count++
	}
	return nil
}

func main() {
	doubleLink := initDoubleLink()
	doubleLink.addRNode(123)
	doubleLink.addRNode(789)
	doubleLink.addRNode(338)
	doubleLink.addLNode(996)
	doubleLink.addRNode(789)
	doubleLink.addRNode("this is string")
	values := doubleLink.rangeLink()
	for _, v := range values {
		fmt.Println("node value:", v)
	}
	var index int64
	index = 1
	fmt.Println("index:", index, " value:", doubleLink.getValue(index))
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值