列表
列表(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),罗伯特·塔马契亚著,乔海燕等译》