双向链表实现原理

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
}

 

posted @ 2019-12-23 00:24  路人Q  阅读(521)  评论(0编辑  收藏  举报