欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

双向链表实现原理

程序员文章站 2023-03-26 20:37:17
package main import "fmt" type LinkNode struct { Data interface{} //数据 Prev *LinkNode //上一个指针 Next *LinkNode //下一个指针 } //创建双向链表 (数据集合) func (node *Lin... ......
package main

import "fmt"

type linknode struct {
	data interface{} //数据
	prev *linknode   //上一个指针
	next *linknode   //下一个指针
}

//创建双向链表  (数据集合)
func (node *linknode) create(data ...interface{}) {
	if node == nil {
		return
	}
	if len(data) == 0 {
		return
	}

	//记录头节点
	head := node

	for _, v := range data {
		//创建新节点
		newnode := new(linknode)
		newnode.data = v
		//新节点指向上一个节点
		newnode.prev = node
		//当前节点的下一个节点是新节点
		node.next = newnode
		//当前节点为下一个节点
		node = node.next
	}

	//头节点的上一个节点prev 可以指向最后一个节点
	//head.prev=node
	node = head

}

//打印双向链表
func (node *linknode) print() {
	if node == nil {
		return
	}
	//正序打印数据
	for node != nil {
		if node.data != nil {
			fmt.println(node.data)
		}
		node = node.next
	}
}

//打印双向链表 倒序
func (node *linknode) print02() {
	if node == nil {
		return
	}
	//指向链表末尾
	for node.next != nil {
		node = node.next
	}
	//从后向前打印数据
	for node.prev != nil {
		if node.data != nil {
			fmt.println(node.data)
		}
		node = node.prev
	}
}

//数据长度 返回值 个数
func (node *linknode) length() int {
	if node == nil {
		return -1
	}
	i := 0
	for node.next != nil {
		i++
		node = node.next
	}
	return i
}

//插入数据 (下标 数据)
func (node *linknode) index(index int, data interface{}) {
	if node == nil {
		return
	}
	if index < 0 {
		return
	}
	if data == nil {
		return
	}

	//记录上一个节点
	prenode := node
	//循环找到插入的节点
	for i := 0; i < index; i++ {
		prenode = node
		if node == nil {
			return
		}
		node = node.next
	}

	//创建新节点
	newnode := new(linknode)
	newnode.data = data
	//将新节点的指针域分别指向上一个节点和下一个节点
	newnode.next = node
	newnode.prev = prenode

	//上一个节点的下一个节点为新节点
	prenode.next = newnode
	//下一个节点的上一个节点为新节点
	node.prev = newnode

}

//删除数据 (下标)
func (node *linknode) delete(index int) {
	if node == nil {
		return
	}
	if index < 0 {
		return
	}

	//记录上一个节点
	prenode := node
	for i := 0; i < index; i++ {
		prenode = node
		if node == nil {
			return
		}

		node = node.next
	}

	//删除节点
	// 把上一个节点的 next 变为当前节点的下一个节点
	prenode.next = node.next
	//将当前节点的下一个节点的上一个节点变为上一个节点
	//当前节点的下一个节点的上一个节点为上一个节点
	node.next.prev = prenode

	//销毁当前节点
	node.data = nil
	node.next = nil
	node.prev = nil
	node = nil
}

//链表销毁
func (node *linknode) destroy() {
	if node == nil {
		return
	}

	node.next.destroy()

	node.data = nil
	node.next = nil
	node.prev = nil
	node = nil
}