【Golang 数据结构与法算】 forward_list 单向列表

package forward_list

import (
	"data-structures-and-algorithms/types"
	"fmt"
	"strings"
)

// Node 单向列表节点
type Node struct {
	Data types.Sortable
	next *Node
}

// insert 插入v为当前节点后继
func (e *Node) insert(v types.Sortable) *Node {
	p := &Node{Data: v, next: e.next}
	e.next = p
	return p
}

// ForwardList 单向列表
type ForwardList struct {
	size int
	root *Node
}

// New 初始化列表
func New() *ForwardList {
	return &ForwardList{
		size: 0,
		root: &Node{Data: nil, next: nil},
	}
}

// Size 列表元素个数
func (l *ForwardList) Size() int {
	return l.size
}

// Empty 列表是否为空
func (l *ForwardList) Empty() bool {
	return l.size <= 0
}

// Front 首元素
func (l *ForwardList) Front() *Node {
	return l.root.next
}

// RemoveAfter at的直接后继存在时,将其移除并返回其值
func (l *ForwardList) RemoveAfter(at *Node) types.Sortable {
	e := at.next
	if e == nil {
		return nil
	}
	l.size--
	at.next = e.next
	return e.Data
}

// PushFront 将v作为首元素值插入
func (l *ForwardList) PushFront(v types.Sortable) *Node {
	l.size++
	return l.root.insert(v)
}

// PopFront 非空时移除首元素并返回其值
func (l *ForwardList) PopFront() types.Sortable {
	return l.RemoveAfter(l.root)
}

// Clear 清空单向列表, 并返回删除元素个数
func (l *ForwardList) Clear() int {
	l.root.next = nil
	size := l.size
	l.size = 0
	return size
}

// Merge 将other元素追加到l末尾
func (l *ForwardList) Merge(other *ForwardList) int {
	end := l.root
	for ; end.next != nil; end = end.next {
	}
	for e := other.root.next; e != nil; e = e.next {
		end = end.insert(e.Data)
	}
	l.size += other.size
	return other.size
}

// Remove 将值为v的元素从l中移除
func (l *ForwardList) Remove(v types.Sortable) int {
	size := l.size
	for e := l.root; e.next != nil; {
		if e.next.Data != v {
			e = e.next
			continue
		}
		l.RemoveAfter(e)
	}
	return size - l.size
}

// String 字符串形式
func (l *ForwardList) String() string {
	if l.Empty() {
		return "{}"
	}
	items := make([]string, 0, l.Size())
	for e := l.root; e.next != nil; e = e.next {
		items = append(items, fmt.Sprintf("%v", e.next.Data))
	}
	return "{" + strings.Join(items, ", ") + "}"
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值