添加测试用例
This commit is contained in:
parent
a4ea096e3d
commit
3e2af31678
9 changed files with 335 additions and 130 deletions
|
@ -12,163 +12,163 @@ const (
|
|||
|
||||
// Node 链表中的一个结点
|
||||
type Node[E any] struct {
|
||||
Element E //保存的内容
|
||||
Prev *Node[E] //前一个结点
|
||||
Next *Node[E] //后一个结点
|
||||
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,
|
||||
element: n.element,
|
||||
prev: nil,
|
||||
next: nil,
|
||||
}
|
||||
return node
|
||||
}
|
||||
|
||||
// LinkedList 链表,实现了List
|
||||
type LinkedList[E any] struct {
|
||||
Len uint //链表中元素个数
|
||||
First *Node[E] //头指针
|
||||
Last *Node[E] //尾指针
|
||||
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,
|
||||
len: 0,
|
||||
first: nil,
|
||||
last: nil,
|
||||
}
|
||||
}
|
||||
|
||||
func (l *LinkedList[E]) Size() uint {
|
||||
return l.Len
|
||||
return l.len
|
||||
}
|
||||
|
||||
func (l *LinkedList[E]) IsEmpty() bool {
|
||||
return l.Len == 0
|
||||
return l.len == 0
|
||||
}
|
||||
|
||||
func (l *LinkedList[E]) IsNotEmpty() bool {
|
||||
return l.Len != 0
|
||||
return l.len != 0
|
||||
}
|
||||
|
||||
func (l *LinkedList[E]) Append(element E) bool {
|
||||
//超出最大值无法添加
|
||||
if l.Len == CAPACITY {
|
||||
if l.len == CAPACITY {
|
||||
return false
|
||||
}
|
||||
node := &Node[E]{
|
||||
Element: element,
|
||||
Prev: nil,
|
||||
Next: nil,
|
||||
element: element,
|
||||
prev: nil,
|
||||
next: nil,
|
||||
}
|
||||
//链表为空,头指针指向该结点
|
||||
if l.First == nil {
|
||||
l.First = node
|
||||
l.Last = node
|
||||
if l.first == nil {
|
||||
l.first = node
|
||||
l.last = node
|
||||
} else {
|
||||
//链表不为空,添加到尾部
|
||||
node.Prev = l.Last
|
||||
l.Last.Next = node
|
||||
l.Last = node
|
||||
node.prev = l.last
|
||||
l.last.next = node
|
||||
l.last = node
|
||||
}
|
||||
l.Len++
|
||||
l.len++
|
||||
return true
|
||||
}
|
||||
|
||||
func (l *LinkedList[E]) Insert(index uint, element E) bool {
|
||||
//当前size已经达到最大值或者索引越界
|
||||
if l.Len == CAPACITY || index > l.Len {
|
||||
if l.len == CAPACITY || index > l.len {
|
||||
return false
|
||||
}
|
||||
node := &Node[E]{
|
||||
Element: element,
|
||||
Prev: nil,
|
||||
Next: nil,
|
||||
element: element,
|
||||
prev: nil,
|
||||
next: nil,
|
||||
}
|
||||
//插入头部
|
||||
if index == 0 {
|
||||
if l.First == nil {
|
||||
if l.first == nil {
|
||||
//链表为空
|
||||
l.First = node
|
||||
l.Last = node
|
||||
l.first = node
|
||||
l.last = node
|
||||
} else {
|
||||
//链表不为空
|
||||
node.Next = l.First
|
||||
l.First.Prev = node
|
||||
l.First = node
|
||||
node.next = l.first
|
||||
l.first.prev = node
|
||||
l.first = node
|
||||
}
|
||||
} else if index == l.Len {
|
||||
} else if index == l.len {
|
||||
//插入尾部
|
||||
l.Last.Next = node
|
||||
node.Prev = l.Last
|
||||
l.Last = node
|
||||
l.last.next = node
|
||||
node.prev = l.last
|
||||
l.last = node
|
||||
} else {
|
||||
var prev *Node[E]
|
||||
head := l.First
|
||||
head := l.first
|
||||
for i := ZERO; i < index; i++ {
|
||||
prev = head
|
||||
head = head.Next
|
||||
head = head.next
|
||||
}
|
||||
node.Next = head
|
||||
node.Prev = prev
|
||||
prev.Next = node
|
||||
head.Prev = node
|
||||
node.next = head
|
||||
node.prev = prev
|
||||
prev.next = node
|
||||
head.prev = node
|
||||
}
|
||||
l.Len++
|
||||
l.len++
|
||||
return true
|
||||
}
|
||||
|
||||
func (l *LinkedList[E]) Remove(index uint) bool {
|
||||
if index >= l.Len {
|
||||
if index >= l.len {
|
||||
return false
|
||||
}
|
||||
head := l.First
|
||||
head := l.first
|
||||
var prev *Node[E]
|
||||
for i := ZERO; i < index; i++ {
|
||||
prev = head
|
||||
head = head.Next
|
||||
head = head.next
|
||||
}
|
||||
//删除第一个结点
|
||||
if head == l.First {
|
||||
l.First.Next = nil
|
||||
l.First = head.Next
|
||||
} else if head == l.Last {
|
||||
if head == l.first {
|
||||
l.first.next = nil
|
||||
l.first = head.next
|
||||
} else if head == l.last {
|
||||
//删除最后一个结点
|
||||
l.Last = prev
|
||||
l.Last.Next = nil
|
||||
l.last = prev
|
||||
l.last.next = nil
|
||||
} else {
|
||||
prev.Next = head.Next
|
||||
head.Next.Prev = prev
|
||||
prev.next = head.next
|
||||
head.next.prev = prev
|
||||
}
|
||||
l.Len--
|
||||
l.len--
|
||||
return true
|
||||
}
|
||||
|
||||
func (l *LinkedList[E]) Get(index uint) *E {
|
||||
if index >= l.Len {
|
||||
if index >= l.len {
|
||||
return nil
|
||||
}
|
||||
node := l.First
|
||||
node := l.first
|
||||
for i := ZERO; i < index; i++ {
|
||||
node = node.Next
|
||||
node = node.next
|
||||
}
|
||||
return &(node.Element)
|
||||
return &(node.element)
|
||||
}
|
||||
|
||||
func (l *LinkedList[E]) Set(index uint, element E) bool {
|
||||
if index >= l.Len {
|
||||
if index >= l.len {
|
||||
return false
|
||||
}
|
||||
node := l.First
|
||||
node := l.first
|
||||
for i := ZERO; i < index; i++ {
|
||||
node = node.Next
|
||||
node = node.next
|
||||
}
|
||||
node.Element = element
|
||||
node.element = element
|
||||
return true
|
||||
}
|
||||
|
||||
|
@ -182,57 +182,57 @@ func (l *LinkedList[E]) PushFront(element E) bool {
|
|||
|
||||
func (l *LinkedList[E]) PopBack() *E {
|
||||
//链表为空
|
||||
if l.Len == 0 {
|
||||
if l.len == 0 {
|
||||
return nil
|
||||
}
|
||||
node := l.Last
|
||||
node := l.last
|
||||
//只有一个元素
|
||||
if l.Len == 1 {
|
||||
l.Last = nil
|
||||
l.First = nil
|
||||
if l.len == 1 {
|
||||
l.last = nil
|
||||
l.first = nil
|
||||
} else {
|
||||
l.Last = node.Prev
|
||||
l.Last.Next = nil
|
||||
l.last = node.prev
|
||||
l.last.next = nil
|
||||
}
|
||||
l.Len--
|
||||
return &(node.Element)
|
||||
l.len--
|
||||
return &(node.element)
|
||||
}
|
||||
|
||||
func (l *LinkedList[E]) PopFront() *E {
|
||||
if l.Len == 0 {
|
||||
if l.len == 0 {
|
||||
return nil
|
||||
}
|
||||
node := l.First
|
||||
if l.Len == 1 {
|
||||
l.First = nil
|
||||
l.Last = nil
|
||||
node := l.first
|
||||
if l.len == 1 {
|
||||
l.first = nil
|
||||
l.last = nil
|
||||
} else {
|
||||
l.First = node.Next
|
||||
l.First.Prev = nil
|
||||
l.first = node.next
|
||||
l.first.prev = nil
|
||||
}
|
||||
l.Len--
|
||||
return &(node.Element)
|
||||
l.len--
|
||||
return &(node.element)
|
||||
}
|
||||
|
||||
func (l *LinkedList[E]) PullBack() *E {
|
||||
if l.Len == 0 {
|
||||
if l.len == 0 {
|
||||
return nil
|
||||
}
|
||||
return &(l.Last.Element)
|
||||
return &(l.last.element)
|
||||
}
|
||||
|
||||
func (l *LinkedList[E]) PullFront() *E {
|
||||
if l.Len == 0 {
|
||||
if l.len == 0 {
|
||||
return nil
|
||||
}
|
||||
return &(l.First.Element)
|
||||
return &(l.first.element)
|
||||
}
|
||||
|
||||
// Iterator 获取该链表的迭代器
|
||||
func (l *LinkedList[E]) Iterator() Iterator[E] {
|
||||
return &LinkedListIterator[E]{
|
||||
reverse: false,
|
||||
next: l.First,
|
||||
next: l.first,
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -240,7 +240,7 @@ func (l *LinkedList[E]) Iterator() Iterator[E] {
|
|||
func (l *LinkedList[E]) ReverseIterator() Iterator[E] {
|
||||
return &LinkedListIterator[E]{
|
||||
reverse: true,
|
||||
next: l.Last,
|
||||
next: l.last,
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -260,9 +260,9 @@ func (l *LinkedListIterator[E]) Next() E {
|
|||
panic("iterator is empty.")
|
||||
}
|
||||
if l.reverse {
|
||||
l.next = e.Prev
|
||||
l.next = e.prev
|
||||
} else {
|
||||
l.next = e.Next
|
||||
l.next = e.next
|
||||
}
|
||||
return e.Element
|
||||
return e.element
|
||||
}
|
||||
|
|
Reference in a new issue