package list
import "fmt"
type DLinkedList struct {
head, tail *DLinkedNode
size int
}
func NewDLinkedList() *DLinkedList {
list := &DLinkedList{
head: new(DLinkedNode),
tail: new(DLinkedNode),
}
list.head.next = list.tail
list.tail.pre = list.head
return list
}
type DLinkedNode struct {
pre, next *DLinkedNode
key, val interface{}
}
func NewDLinkedNode(key interface{}, val interface{}) *DLinkedNode {
return &DLinkedNode{key: key, val: val}
}
func (this *DLinkedList) RemoveNode(node *DLinkedNode) {
node.pre.next = node.next
node.next.pre = node.pre
this.size--
}
func (this *DLinkedList) AddToHead(node *DLinkedNode) {
node.pre = this.head
node.next = this.head.next
this.head.next.pre = node
this.head.next = node
this.size++
}
func (this *DLinkedList) AddToTail(node *DLinkedNode) {
node.next = this.tail
node.pre = this.tail.pre
this.tail.pre.next = node
this.tail.pre = node
this.size++
}
func (this *DLinkedList) RemoveTail() *DLinkedNode {
pre := this.tail.pre
this.RemoveNode(pre)
return pre
}
func (this *DLinkedList) RemoveHead() *DLinkedNode {
next := this.head.next
this.RemoveNode(next)
return next
}
func (this *DLinkedList) MoveToHead(node *DLinkedNode) {
this.RemoveNode(node)
this.AddToHead(node)
}
func (this *DLinkedList) Length() int {
return this.size
}
func (this *DLinkedList) Print() {
cur := this.head.next
for cur != this.tail {
fmt.Print("{key:", cur.key, " val:", cur.val, "} => ")
cur = cur.next
}
fmt.Println()
}
Go 实现链表
最新推荐文章于 2024-03-17 23:05:14 发布