This repository has been archived on 2024-10-02. You can view files and clone it, but you cannot make any changes to it's state, such as pushing and creating new issues, pull requests or comments.
ltc/glist/linkedlist.go
2022-03-29 11:16:04 +08:00

268 lines
4.6 KiB
Go

package glist
import (
"math"
)
const (
// CAPACITY 链表的最大容量
CAPACITY uint = math.MaxUint
ZERO = uint(0) //uint类型的0
)
// Node 链表中的一个结点
type Node[E any] struct {
element E //保存的内容
prev *Node[E] //前一个结点
next *Node[E] //后一个结点
}
// Clone 克隆Node,返回的Node的Prev和Next均为nil,Element保持不变
func (n *Node[E]) Clone() *Node[E] {
node := &Node[E]{
element: n.element,
prev: nil,
next: nil,
}
return node
}
// LinkedList 链表,实现了List
type LinkedList[E any] struct {
len uint //链表中元素个数
first *Node[E] //头指针
last *Node[E] //尾指针
}
// NewLinkedList 创建一个链表,
//列表的最大容量为uint类型的最大值
func NewLinkedList[E any]() *LinkedList[E] {
return &LinkedList[E]{
len: 0,
first: nil,
last: nil,
}
}
func (l *LinkedList[E]) Size() uint {
return l.len
}
func (l *LinkedList[E]) IsEmpty() bool {
return l.len == 0
}
func (l *LinkedList[E]) IsNotEmpty() bool {
return l.len != 0
}
func (l *LinkedList[E]) Append(element E) bool {
//超出最大值无法添加
if l.len == CAPACITY {
return false
}
node := &Node[E]{
element: element,
prev: nil,
next: nil,
}
//链表为空,头指针指向该结点
if l.first == nil {
l.first = node
l.last = node
} else {
//链表不为空,添加到尾部
node.prev = l.last
l.last.next = node
l.last = node
}
l.len++
return true
}
func (l *LinkedList[E]) Insert(index uint, element E) bool {
//当前size已经达到最大值或者索引越界
if l.len == CAPACITY || index > l.len {
return false
}
node := &Node[E]{
element: element,
prev: nil,
next: nil,
}
//插入头部
if index == 0 {
if l.first == nil {
//链表为空
l.first = node
l.last = node
} else {
//链表不为空
node.next = l.first
l.first.prev = node
l.first = node
}
} else if index == l.len {
//插入尾部
l.last.next = node
node.prev = l.last
l.last = node
} else {
var prev *Node[E]
head := l.first
for i := ZERO; i < index; i++ {
prev = head
head = head.next
}
node.next = head
node.prev = prev
prev.next = node
head.prev = node
}
l.len++
return true
}
func (l *LinkedList[E]) Remove(index uint) bool {
if index >= l.len {
return false
}
head := l.first
var prev *Node[E]
for i := ZERO; i < index; i++ {
prev = head
head = head.next
}
//删除第一个结点
if head == l.first {
l.first.next = nil
l.first = head.next
} else if head == l.last {
//删除最后一个结点
l.last = prev
l.last.next = nil
} else {
prev.next = head.next
head.next.prev = prev
}
l.len--
return true
}
func (l *LinkedList[E]) Get(index uint) *E {
if index >= l.len {
return nil
}
node := l.first
for i := ZERO; i < index; i++ {
node = node.next
}
return &(node.element)
}
func (l *LinkedList[E]) Set(index uint, element E) bool {
if index >= l.len {
return false
}
node := l.first
for i := ZERO; i < index; i++ {
node = node.next
}
node.element = element
return true
}
func (l *LinkedList[E]) PushBack(element E) bool {
return l.Append(element)
}
func (l *LinkedList[E]) PushFront(element E) bool {
return l.Insert(0, element)
}
func (l *LinkedList[E]) PopBack() *E {
//链表为空
if l.len == 0 {
return nil
}
node := l.last
//只有一个元素
if l.len == 1 {
l.last = nil
l.first = nil
} else {
l.last = node.prev
l.last.next = nil
}
l.len--
return &(node.element)
}
func (l *LinkedList[E]) PopFront() *E {
if l.len == 0 {
return nil
}
node := l.first
if l.len == 1 {
l.first = nil
l.last = nil
} else {
l.first = node.next
l.first.prev = nil
}
l.len--
return &(node.element)
}
func (l *LinkedList[E]) PullBack() *E {
if l.len == 0 {
return nil
}
return &(l.last.element)
}
func (l *LinkedList[E]) PullFront() *E {
if l.len == 0 {
return nil
}
return &(l.first.element)
}
// Iterator 获取该链表的迭代器
func (l *LinkedList[E]) Iterator() Iterator[E] {
return &LinkedListIterator[E]{
reverse: false,
next: l.first,
}
}
// ReverseIterator 获取反向迭代器
func (l *LinkedList[E]) ReverseIterator() Iterator[E] {
return &LinkedListIterator[E]{
reverse: true,
next: l.last,
}
}
type LinkedListIterator[E any] struct {
//是否反向,如果为true,则是从尾部向头部迭代
reverse bool
next *Node[E]
}
func (l *LinkedListIterator[E]) Has() bool {
return l.next != nil
}
func (l *LinkedListIterator[E]) Next() E {
e := l.next
if e == nil {
panic("iterator is empty.")
}
if l.reverse {
l.next = e.prev
} else {
l.next = e.next
}
return e.element
}