LinkedList: added support for index and range extraction
This commit is contained in:
+24
-13
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user