算法和设计应用 - 第一部分 数据结构之列表

算法和设计应用 - 第一部分 数据结构之列表

列表

列表(list),是保持线性顺序的对象的容器。抽象的看,列表L是支持下面四种方法的容器:

  • get( r ):返回L中索引为r的元素;如果r<0或r>N-1,则出现错误条件。O(1)
  • set(r, e):将索引位置r的元素替换成e,并发回e;如果r<0或r>N-1,则出现错误条件。O(1)
  • add(r, e):向列表中插入新元素e,索引位置为r;如果r<0或r>N-1,则出现错误条件。O(n)
  • remove( r ):从列表中删除索引为r的元素;如果r<0或r>N-1,则出现错误条件。O(n)

基于数组的实现

//初始化
	L[N]
	n ← 0

//获取
	get(r):
	if r < 0 or r > n - 1
		return 错误索引值
	return L[r]

//设置
	set(r, e):
	if r < 0 or r > n - 1
		return 错误索引值
	L[r] ← e

//插入
	add(r, e):
	if n = N then
		return 列表满错误
	if r < n then
		for i ← n - 1, n - 2, ..., r do
			L[i + 1] ← L[i]
	L[r] ← e
	n = n + 1

//删除
	remove(r):
	e ← L[r]
	if r < n - 1
		for i ← r, r + 1, ..., n - 2 do
			L[i]  ← L[i + 1]
	n ← n + 1
	return e
	

实现:ArrayList

基于链表的实现

抽象的看,列表L是支持下面四种方法的容器:

  • first():返回L中第一个元素的位置;如果为空,则发生错误。O(1)
  • last():返回L中最后一个元素的位置;如果为空,则发生错误。O(1)
  • before( p ):返回位置p的元素的前一个元素的位置;如果p是第一个位置,则发生错误。O(1)
  • after( p ):返回位置p的元素的后一个元素的位置;如果p是最后一个位置,则发生错误。O(1)
  • insertBefore(p, e):在L中位置p的前面插入e。O(1)
  • insertAfter(p, e):在L中位置p的后面插入e。O(1)
  • remove( p ):将位置p的元素删除。O(1)
//初始化
	head //表头索引
	trail //表尾索引
	v //节点
	v.element //节点值
	v.prev //节点前的位置
	v.next //节点后的位置
	size //列表大小
	
//获取首个元素
	first():
	if head = null
		return 错误
	return head.element
	
//获取最后一个元素
	last():
	if tail == null 
		return 错误
	return tail.element
	
//获取位置p之前的元素
	before(p):
	if p <0 or p > size
		return 越界错误
	return (p.prev).element 
	
//获取位置p之后的元素
	after(p):
	if p <0 or p > size
		return 越界错误	
	return (p.next).element 	
//在位置p之前插入元素
	insertBefore(p,e):
	v.emelent = e
	v.prev = p.prev
	v.next = p
	(p.prev).next = v 
	p.prev = v 
	size++
	return v
	
//在位置p之后插入元素
	insertAfter(p,e):
	v.emelent = e
	v.prev = p
	v.next = p.next
	(p.next).prev = v 
	p.next = v
	size++
	return v
	
//删除位置p的元素
	remove(p):
	e ←	p.element
	(p.prev.next) ← p.next
	(p.next.prev) ← p.prev
	p.prev ← null
	p.next  ← null
	size--
	return e
	

实现:LinkedList

应用

参考

[1]: 《[美] 迈克尔T.古德里奇(Michael T.Goodrich),罗伯特·塔马契亚著,乔海燕等译》

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值