Python:链表基础
·
一.引言
链表是一种强大的数据结构,可用于快速插入或删除元素。本文将使用class实现链表,并展示一些基本的函数。
二.链表实现
class Link:
empty=() #just a symbol, It could be "I’m empty"
def __init__(self,first,rest=empty): #The rest of Link is Link or empty
assert rest is Link.empty or isinstance(rest,Link)
self.first=first
self.rest=rest

三.常用函数
1.展示
1.1单层
def display_link(l):
"""
>>> b = Link(4,Link(3, Link(9, Link(1))))
>>> display_link(b)
'< 4 3 9 1 >'
"""
ret='<'
while l is not Link.empty:
ret+=" "+str(l.first)
l=l.rest
return ret+" >"
1.2嵌套
def display_link(l):
"""
>>> a = Link(1, Link(2, Link(1)))
>>> b = Link(3, Link(2, Link(1)))
>>> combined = Link(a, Link(b))
>>> display_link(combined)
'<< 1 2 1 >< 3 2 1 > >'
"""
ret='<'
while l is not Link.empty:
if isinstance(l.first,Link):
ret+=display_link(l.first)
else:
ret+=" "+str(l.first)
l=l.rest
return ret+" >"
2.求和
def sum_link(l):
"""
>>> b = Link(4,Link(3, Link(9, Link(1))))
>>> sum_link(b)
17
"""
# ret=0 #循环版本
# while l is not Link.empty:
# ret+=l.first
# l=l.rest
# return ret
#递归版本
if l is Link.empty:
return 0
return l.first + sum_link(l.rest)
3.map
def map_link(l,f):
"""Given a linked list, lnk, and a one argument function, f, return
a new linked list obtained from applying f to each element of lnk
>>> b = Link(4,Link(3, Link(9, Link(1))))
>>> display_link(map_link(b,lambda x:3+x))
'< 7 6 12 4 >'
"""
if l is Link.empty:
return l
return Link(f(l.first),map_link(l.rest,f))
4.使用map修改原链表
def mutate_link(l,f):
"""Given a linked list, lnk, and a one argument function, f, mutate
the linked list by applying f to each element of it
>>> b = Link(4,Link(3, Link(9, Link(1))))
>>> mutate_link(b,lambda x:3+x)
>>> display_link(b)
'< 7 6 12 4 >'
"""
# #递归版本
# if l is Link.empty:
# return
# l.first=f(l.first)
# mutate_link(l.rest,f)
#循环版本
#较难理解,可以用Python tutor跑一遍辅助理解
while l is not Link.empty: #note thatt the original lnk will not shrink!
l.first=f(l.first)
l=l.rest
5.倒序
def reverse_link(l):
"""return a new linked list whose order of elements is reversed
>>> b = Link(4,Link(3, Link(9, Link(1))))
>>> display_link(reverse_link(b))
'< 1 9 3 4 >'
"""
if l is Link.empty or l.rest is Link.empty:
return l
rest=reverse_link(l.rest)
p=rest
while p.rest is not Link.empty:
p=p.rest
p.rest=Link(l.first)
return rest
更多推荐
所有评论(0)