Go语言自定义链表实现中begin()与next()函数编写问题求助
Go自定义链表迭代器实现问题修复
核心错误点
- 接口方法签名不匹配:
Iterator接口定义的是next()方法,你实现的是大写开头的Next(),Go要求接口实现的方法名、参数、返回值完全一致,大小写敏感 next()返回值类型错误:你当前返回*it是ListIterator值类型,只有*ListIterator指针类型才实现了Iterator接口,需要直接返回指针- 方法归属错误:
begin()、append()是Container容器接口的方法,应该绑定到List结构体,而不是ListIterator迭代器结构体 next()逻辑错误:接收者it是指针拷贝,直接修改it = it.next不会影响原迭代器,直接返回it.next即可- 结束判断逻辑错误:原
isEnd()判断it.next == nil会漏掉最后一个节点,应该判断当前迭代器本身是否为空
修复后的完整代码
package main import ( "fmt" ) type Vector struct { num []interface{} size int } type VectorIterator struct { x Vector i int } type List struct { head *ListIterator // 存储链表头节点,语义更清晰 } type ListIterator struct { num interface{} next *ListIterator } type Container interface { begin() Iterator append(v interface{}) } type Iterator interface { next() Iterator isEnd() bool Deref() interface{} } // ListIterator实现Iterator接口 func (it *ListIterator) isEnd() bool { return it == nil } func (it *VectorIterator) isEnd() bool { // 适配Vector场景的结束判断 return it.i >= len(it.x.num) } func (it *ListIterator) Deref() interface{} { return it.num } func (it *ListIterator) next() Iterator { if it == nil { return nil } return it.next } // List实现Container接口 func (l *List) begin() Iterator { return l.head // 直接返回头节点作为起始迭代器 } func (l *List) append(v interface{}) { newNode := &ListIterator{num: v} if l.head == nil { l.head = newNode return } // 遍历到最后一个节点追加新节点 cur := l.head for cur.next != nil { cur = cur.next } cur.next = newNode } // 测试用例 func main() { var c Container = &List{} c.append(1) c.append("test") c.append(3.14) for it := c.begin(); !it.isEnd(); it = it.next() { fmt.Println(it.Deref()) } }
内容的提问来源于stack exchange,提问作者jalen002
相关产品推荐
相关产品推荐

