雙向鏈表實現原理

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
}
相關文章
相關標籤/搜索