golang实现双链表

双链表的定义

一个节点包含数据区,还有一个指针指向前一个节点,一个指针指向后一个节点
因此实现双链表需要定义这样的一个数据结构

数据结构的定义

import "fmt"
type Node struct {
	Data int
	Prev *Node
	Next *Node
}

实现链表功能的封装

type DeLinkList struct {
	head *Node  # 由于链表任何操作都需要从头部开始,因此这里定义一个链表头部的属性
}
// 只需要判断首部节点是否为空
func (self *DeLinkList) IsEmpty() bool {
	return self.head == nil
}
// 链表长度
func (self *DeLinkList) Length() int  {
	count := 0
	head := self.head
	for head != nil {
		count += 1
		head = head.Next
	}

	return count
}
// 从头遍历
func (self *DeLinkList) Range()  {
	head := self.head
	for head != nil {
		fmt.Println("当前元素", head.Data)
		head = head.Next
	}
}
// 在头部添加节点
func (self *DeLinkList) Add(value int)  {
	newNode := &Node{Data:value}
	if self.head == nil {
		self.head = newNode
	} else {
		newNode.Next = self.head
		self.head.Prev = newNode
		self.head = newNode
	}


}
// 在尾部添加元素
func (self *DeLinkList) Append(value int)  {
	head := self.head
	for head.Next != nil {
		head = head.Next
	}
	newNode := &Node{Data:value}
	newNode.Prev = head
	head.Next = newNode
}
// 删除任意位置的元素, todo 需要处理: 删除的元素在头部, 中部,尾部三种情况
func (self *DeLinkList) Delete(value int)  {
	head := self.head
	// 删除头部
	if head.Data == value {
		self.head = head.Next
	} else {
		for head != nil {
			if head.Data == value {
				// 修改这个元素之前的一个元素Next指针
				head.Prev.Next = head.Next
				if head.Next != nil {
					head.Next.Prev = head.Prev
				}
				break
			} else {
				head = head.Next
			}

		}
	}
}
// 在任意位置插入数据 todo 需要考虑插入数据位于 首部, 尾部,中间的处理情况
func (self *DeLinkList) Insert(index, value int)  {
	if index <= 0 {
		self.Add(value)
	} else if index > self.Length() {
		self.Append(value)
	} else {
		// 插入数据在中间的情况,需要找到index 之前的元素修改指针
		head := self.head
		count := 0
		for count < index {
			count += 1
			head = head.Next
		}
		newNode := &Node{Data:value}
		newNode.Prev = head.Prev
		newNode.Next = head
		head.Prev.Next = newNode
		head.Prev = newNode

	}
}

func main()  {
	delink := &DeLinkList{}
	delink.Add(10)
	delink.Add(15)
	delink.Append(8)
	delink.Append(66)
	delink.Append(15)
	delink.Insert(2, 88)
	fmt.Println("长度", delink.Length())
	delink.Range()
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值