LinkedList: added support for index and range extraction

This commit is contained in:
2026-05-19 06:42:45 +02:00
parent 081395be5f
commit 1aea1c14d2
4 changed files with 38 additions and 15 deletions
+24 -13
View File
@@ -19,7 +19,7 @@ func (self *ListNode) Data() any {
}
type LinkedList struct {
count uint32
count int
first *ListNode
last *ListNode
}
@@ -29,7 +29,7 @@ func NewLinkedList() (list *LinkedList) {
return
}
func (ls *LinkedList) Len() uint32 {
func (ls *LinkedList) Len() int {
return ls.count
}
@@ -121,7 +121,7 @@ func (ls *LinkedList) Last() (data interface{}, err error) {
return
}
func (ls *LinkedList) NodeAt(index uint32) (node *ListNode, err error) {
func (ls *LinkedList) NodeAt(index int) (node *ListNode, err error) {
if ls.count == 0 {
err = errorListEmpty()
} else if index > ls.count {
@@ -130,7 +130,7 @@ func (ls *LinkedList) NodeAt(index uint32) (node *ListNode, err error) {
node = ls.last
} else {
current := ls.first
for pos := uint32(0); pos < index; pos++ {
for range index {
current = current.next
}
node = current
@@ -138,7 +138,7 @@ func (ls *LinkedList) NodeAt(index uint32) (node *ListNode, err error) {
return
}
func (ls *LinkedList) At(index uint32) (data interface{}, err error) {
func (ls *LinkedList) At(index int) (data interface{}, err error) {
node, err := ls.NodeAt(index)
if err == nil {
data = node.data
@@ -146,12 +146,12 @@ func (ls *LinkedList) At(index uint32) (data interface{}, err error) {
return
}
func (ls *LinkedList) Insert(index uint32, data interface{}) *ListNode {
func (ls *LinkedList) Insert(index int, data any) *ListNode {
var prev *ListNode
prev = nil
current := ls.first
for pos := uint32(0); current != nil && pos < index; pos++ {
for pos := 0; current != nil && pos < index; pos++ {
prev = current
current = current.next
}
@@ -178,10 +178,21 @@ func (ls *LinkedList) PushBackStringArray(items []string) {
}
}
// type TraverseOperator func(index uint32, elem interface{}, userData interface{}) (err error)
func (ls *LinkedList) Sub(start, end int) (subList *LinkedList) {
subList = NewLinkedList()
if node, err := ls.NodeAt(start); err == nil {
for i := start; i < end && node != nil; i++ {
subList.PushBack(node.data)
node = node.next
}
}
return
}
// type TraverseOperator func(index int, elem interface{}, userData interface{}) (err error)
// func (self *LinkedList) Traverse(op TraverseOperator, user_data interface{}) (err error) {
// index := uint32(0)
// index := int(0)
// for current := self.first; current != nil; current = current.next {
// err = op(index, current.data, user_data)
// if err != nil {
@@ -193,7 +204,7 @@ func (ls *LinkedList) PushBackStringArray(items []string) {
// }
// func (self *LinkedList) Traverse2(observer Observer, abortOnError bool) (err error) {
// index := uint32(0)
// index := int(0)
// for current := self.first; current != nil; current = current.next {
// err = observer.Observe(current, index)
// if err != nil && abortOnError {
@@ -227,9 +238,9 @@ func (ls *LinkedList) FindNext(eqFunc EqualFunc, startNode *ListNode) (targetNod
}
// type DataFeeder func(user_data interface{}) interface{}
// type NodeObserver func(node *ListNode, index uint32, userData interface{})
// type NodeObserver func(node *ListNode, index int, userData interface{})
// func (self *LinkedList) FeedTail(feeder DataFeeder, feederUserData interface{}, observer NodeObserver, observerUserData interface{}) (count uint32) {
// func (self *LinkedList) FeedTail(feeder DataFeeder, feederUserData interface{}, observer NodeObserver, observerUserData interface{}) (count int) {
// count = 0
// for item := feeder(feederUserData); item != nil; item = feeder(feederUserData) {
// // fmt.Println("Item", count, item)
@@ -242,7 +253,7 @@ func (ls *LinkedList) FindNext(eqFunc EqualFunc, startNode *ListNode) (targetNod
// return
// }
// func (self *LinkedList) FeedTail2(feeder Feeder, observer Observer, abortOnError bool) (count uint32, err error) {
// func (self *LinkedList) FeedTail2(feeder Feeder, observer Observer, abortOnError bool) (count int, err error) {
// count = 0
// // item := feeder.Next()
// for item, err1 := feeder.Next(); item != nil; item, err1 = feeder.Next() {