focus/priority_list/priority_list.go

166 lines
3.0 KiB
Go
Raw Normal View History

new file: .gitignore new file: LICENSE new file: README.md new file: compare/compare.go new file: for_test.go new file: heap/heap.go new file: heap/heap_test.go new file: interface.go new file: lastack/lastack.go new file: lastack/lastack_test.go new file: list/list.go new file: list/list_test.go new file: map/hashmap/hashmap.go new file: map/hashmap/hashmap_test.go new file: priority_list/iterator.go new file: priority_list/priority_list.go new file: priority_list/priority_list_test.go new file: priority_queue/iterator.go new file: priority_queue/priority_queue.go new file: priority_queue/priority_queue_test.go new file: priority_queue/vbt.go new file: priority_queue/vbt_test.go new file: priority_queuekey/iterator.go new file: priority_queuekey/priority_queuekey.go new file: priority_queuekey/priority_queuekey_test.go new file: priority_queuekey/vbt.go new file: priority_queuekey/vbt_test.go new file: set/hashset/hashset.go new file: set/hashset/hashset_test.go new file: set/treeset/treeset.go new file: set/treeset/treeset_test.go new file: sparse_array/array2/array2.go new file: sparse_array/array2/array2_test.go new file: sparse_array/array3/array3.go new file: sparse_array/array3/array3_test.go new file: sparse_array/arrayn/arrayn.go new file: sparse_array/arrayn/arrayn_test.go new file: stack/stack.go new file: stack/stack_test.go new file: tree/avl/avl.go new file: tree/avl/avl_test.go new file: tree/avl/iterator.go new file: tree/avldup/avldup.go new file: tree/avldup/avldup_test.go new file: tree/avldup/iterator.go new file: tree/avlkey/avlkey.go new file: tree/avlkey/avlkey_test.go new file: tree/avlkey/iterator.go new file: tree/avlkeydup/avlkeydup.go new file: tree/avlkeydup/avlkeydup_test.go new file: tree/avlkeydup/iterator.go new file: tree/vbt/iterator.go new file: tree/vbt/vbt.go new file: tree/vbt/vbt_test.go new file: tree/vbtkey/iterator.go new file: tree/vbtkey/vbtkey.go new file: tree/vbtkey/vbtkey_test.go
2019-05-08 02:42:51 +00:00
package plist
import (
"strings"
"474420502.top/eson/structure/compare"
"github.com/davecgh/go-spew/spew"
)
type Node struct {
prev, next *Node
value interface{}
}
type PriorityList struct {
head, tail *Node
size int
Compare compare.Compare
}
func New(Compare compare.Compare) *PriorityList {
pl := &PriorityList{head: &Node{}, tail: &Node{}, size: 0, Compare: Compare}
pl.head.next = pl.tail
pl.tail.prev = pl.head
return pl
}
func (pl *PriorityList) String() string {
content := ""
cur := pl.head.next
for ; cur != pl.tail; cur = cur.next {
content += spew.Sprint(cur.value) + " "
}
content = strings.TrimRight(content, " ")
return content
}
func (pl *PriorityList) RString() string {
content := ""
cur := pl.tail.prev
for ; cur != pl.head; cur = cur.prev {
content += spew.Sprint(cur.value) + " "
}
content = strings.TrimRight(content, " ")
return content
}
func (pl *PriorityList) Iterator() *Iterator {
return &Iterator{pl: pl, cur: pl.head}
}
func (pl *PriorityList) CircularIterator() *CircularIterator {
return &CircularIterator{pl: pl, cur: pl.head}
}
func (pl *PriorityList) Size() int {
return pl.size
}
func (pl *PriorityList) Push(value interface{}) {
pl.size++
pnode := &Node{value: value}
if pl.size == 1 {
pl.head.next = pnode
pl.tail.prev = pnode
pnode.prev = pl.head
pnode.next = pl.tail
return
}
cur := pl.head
for ; cur.next != pl.tail; cur = cur.next {
if pl.Compare(value, cur.next.value) > 0 {
cnext := cur.next
cur.next = pnode
cnext.prev = pnode
pnode.prev = cur
pnode.next = cnext
return
}
}
cur.next = pnode
pnode.prev = cur
pnode.next = pl.tail
pl.tail.prev = pnode
}
func (pl *PriorityList) Top() (result interface{}, ok bool) {
if pl.size > 0 {
return pl.head.next.value, true
}
return nil, false
}
func (pl *PriorityList) Pop() (result interface{}, ok bool) {
if pl.size > 0 {
pl.size--
temp := pl.head.next
temp.next.prev = pl.head
pl.head.next = temp.next
return temp.value, true
}
return nil, false
}
func (pl *PriorityList) Get(idx int) (interface{}, bool) {
if n, ok := pl.GetNode(idx); ok {
return n.value, true
}
return nil, false
}
func (pl *PriorityList) GetNode(idx int) (*Node, bool) {
if idx >= 0 {
cur := pl.head.next
for i := 0; cur != pl.tail; i++ {
if i == idx {
return cur, true
}
cur = cur.next
}
} else {
cur := pl.tail.prev
for i := -1; cur != pl.head; i-- {
if i == idx {
return cur, true
}
cur = cur.prev
}
}
return nil, false
}
func (pl *PriorityList) RemoveWithIndex(idx int) {
if n, ok := pl.GetNode(idx); ok {
pl.Remove(n)
}
}
func (pl *PriorityList) Remove(node *Node) {
prev := node.prev
next := node.next
prev.next = next
next.prev = prev
node.prev = nil
node.next = nil
pl.size--
}
func (pl *PriorityList) Values() []interface{} {
values := make([]interface{}, pl.size, pl.size)
for i, cur := 0, pl.head.next; cur != pl.tail; i, cur = i+1, cur.next {
values[i] = cur.value
}
return values
}