代码与吐槽
- 下面的代码实现了支持比较的泛型的链表
- 头部新增
- 尾部新增
- 删除指定元素
- string格式化打印
- 不得不说,go语言方法前面的p是接收者不能直接修改外部指针的引用,也就是说令p等于新增元素是不成立的
- 但是又不想让函数有返回值,于是就改成了传入头指针的地址来实现
type List[T comparable] struct {
next *List[T]
val T
}
func (p *List[T]) String() string {
result := ""
for p != nil {
result += fmt.Sprintf("%v ", p.val)
p = p.next
}
return result
}
func (p *List[T]) addHead(root **List[T], val T) {
*root = &List[T]{val: val, next: p}
}
func (p *List[T]) push(val T) {
tp := &List[T]{val: val, next: nil}
for p.next != nil {
p = p.next
}
p.next = tp
}
func (p *List[T]) delete(val T) {
// 如果链表为空,直接返回
if p == nil {
return
}
if p.val == val {
*p = *p.next
}
// 遍历链表,找到要删除的节点
current := p
for current.next != nil {
if current.next.val == val {
current.next = current.next.next
return
}
current = current.next
}
}
func NewList[T comparable](val T) *List[T] {
return &List[T]{val: val}
}
func main() {
l := NewList(1)
fmt.Println("Original list:", l.String())
l.addHead(&l, 2)
l.addHead(&l, 3)
l.delete(2)
l.delete(3)
l.push(2)
l.push(3)
l.push(4)
fmt.Println("Updated list:", l.String())
}