1.创建一个空的链表:
class IntNote(object):
"""docstring for IntNote"""
def __init__(self,i,n):
self.item=i
self.next=n
class SLList(object):
def __init__(self, x=None):
if x is None:
self.__first = None
self.__size = 0
else:
self.__first = IntNote(x,None)
self.__size
def add_first(self,x):
self.__size+=1
self.__first=IntNote(x,self.__first)
def add_last(self,x):
self.__size+=1
p=self.__first
while p.next is not None:
p=p.next
p.next = IntNote(x,None)
def size(self):
return self.__size
class Intlist(object):
def __init__(self,first,rest):
self.first = first
self.rest = rest
def size(self):
if self.rest is None:
return 1
else:
return 1+self.rest.size()
def iterative_size(self):
p=self
total_size=0
while p is not None:
total_size+=1
p=p.rest
return total_size
def get(self,i):
if i==0:
return self.first
else:
return self.rest.get(i-1)
'''l=Intlist(5,None)
l=Intlist(10,l)
l=Intlist(15,l)
#print(l.size())\
#print(l.iterative_size())
print(l.get(0))'''
l=SLList()
#l.add_first(15)
l.add_last(10)
2.添加元素会出现问题:
输出:
AttributeError: 'NoneType' object has no attribute 'next'
def add_last(self,x):
self.__size+=1
p=self.__first
while p.next is not None:
p=p.next
p.next = IntNote(x,None)
如何改进?
这里的本质问题是空链表和非空链表的第一个元素不一样
我们可以使用哨兵系统来解决
更改add last:
class IntNote(object):
"""docstring for IntNote"""
def __init__(self,i,n):
self.item=i
self.next=n
class SLList(object):
#初始化,用户不填哨兵为1,用户填了就在哨兵后加一个
def __init__(self, x=None):
self.__sentinel = IntNote(76,None) #哨兵76
if x is None:
self.__size = 0
else:
self.__sentinel.next = IntNote(x,None)
self.__size = 1
def add_first(self,x):
self.__size+=1
self.__first=IntNote(x,self.__first)
def add_last(self,x):
self.__size+=1
p=self.__sentinel
while p.next is not None:
p=p.next
p.next = IntNote(x,None)
def size(self):
return self.__size
class Intlist(object):
def __init__(self,first,rest):
self.first = first
self.rest = rest
def size(self):
if self.rest is None:
return 1
else:
return 1+self.rest.size()
def iterative_size(self):
p=self
total_size=0
while p is not None:
total_size+=1
p=p.rest
return total_size
def get(self,i):
if i==0:
return self.first
else:
return self.rest.get(i-1)
'''l=Intlist(5,None)
l=Intlist(10,l)
l=Intlist(15,l)
#print(l.size())\
#print(l.iterative_size())
print(l.get(0))'''
l=SLList()
#l.add_first(15)
l.add_last(10)
这样无论给不给元素都能正确运行
更改add first:
class IntNote(object):
"""docstring for IntNote"""
def __init__(self,i,n):
self.item=i
self.next=n
class SLList(object):
#初始化,用户不填哨兵为1,用户填了就在哨兵后加一个
def __init__(self, x=None):
self.__sentinel = IntNote(76,None) #哨兵76
if x is None:
self.__size = 0
else:
self.__sentinel.next = IntNote(x,None)
self.__size = 1
def add_first(self,x):
original_first = self.__sentinel.next
self.__sentinel.next = IntNote(x,original_first)
self.__size +=1
def add_last(self,x):
self.__size+=1
p=self.__sentinel
while p.next is not None:
p=p.next
p.next = IntNote(x,None)
def size(self):
return self.__size
class Intlist(object):
def __init__(self,first,rest):
self.first = first
self.rest = rest
def size(self):
if self.rest is None:
return 1
else:
return 1+self.rest.size()
def iterative_size(self):
p=self
total_size=0
while p is not None:
total_size+=1
p=p.rest
return total_size
def get(self,i):
if i==0:
return self.first
else:
return self.rest.get(i-1)
'''l=Intlist(5,None)
l=Intlist(10,l)
l=Intlist(15,l)
#print(l.size())\
#print(l.iterative_size())
print(l.get(0))'''
l=SLList()
l.add_first(15)
l.add_last(10)
改进:目前把所有元素循环一遍才能向最后添加一个元素
双向链表
如果用缓存的方式,以下哪种或哪几种方法会很慢:
add_ last()
get_ last()
remove_ last()
答案:remove最慢 因为不知道前面有几个还是要遍历一遍
更简洁的方法:
更改add first:
def add_first(self,x):
self.__sentinel.next = IntNote(x,self.__sentinel.next,self.__sentinel) #更改3根线
self.__sentinel.next.next.prev = self.__sentinel.next #1根线
'''original_first = self.__sentinel.next
new_first = IntNote(x,None,None)
news_first.next = original_first
new_first.prev = self.__sentinel
self.__sentinel.next = new_first
original_first.prev =news_first'''
同样可以改add last:
class IntNote(object):
"""docstring for IntNote"""
def __init__(self,i,n,p):
self.item=i
self.next=n
self.prev=p
class SLList(object):
def __init__(self, x=None):
self.__sentinel = IntNote(76,None,None) #哨兵76
self.__sentinel.next = self.__sentinel
self.__sentinel.prev = self.__sentinel
self._last = self.__sentinel.prev
if x is None:
self.__size = 0
else:
self.__sentinel.next = IntNote(x,self.__sentinel,self.__sentinel)
self.__sentinel.prev = self.__sentinel.next
self.__size = 1
def add_first(self,x):
self.__sentinel.next = IntNote(x,self.__sentinel.next,self.__sentinel) #更改3根线
self.__sentinel.next.next.prev = self.__sentinel.next #1根线
self.__size+=1
'''original_first = self.__sentinel.next
new_first = IntNote(x,None,None)
news_first.next = original_first
new_first.prev = self.__sentinel
self.__sentinel.next = new_first
original_first.prev =news_first'''
def add_last(self,x):
self.__size+=1
self.__sentinel.prev =IntNote(x,self.__sentinel,self.__sentinel.prev)
self.__sentinel.prev.prev.next = self.__sentinel.prev
def size(self):
return self.__size
class Intlist(object):
def __init__(self,first,rest):
self.first = first
self.rest = rest
def size(self):
if self.rest is None:
return 1
else:
return 1+self.rest.size()
def iterative_size(self):
p=self
total_size=0
while p is not None:
total_size+=1
p=p.rest
return total_size
def get(self,i):
if i==0:
return self.first
else:
return self.rest.get(i-1)
'''l=Intlist(5,None)
l=Intlist(10,l)
l=Intlist(15,l)
#print(l.size())\
#print(l.iterative_size())
print(l.get(0))'''
l=SLList()
l.add_first(15)
l.add_last(10)
抽象数据类型
抽象数据类型(ADT) 仅由其操作定义,而不是由其实现定义。
是计算机科学中具有类似行为的特定类别的数据结构的数学模型;或者具有类似语义的一种或多种程序设计语言的数据类型。抽象数据类型是描述数据结构的一种理论工具,其目的是使人们能够独立于程序的实现细节来理解数据结构的特性。抽象数据类型的定义取决于它的一组逻辑特性,而与计算机内部如何表示无关。
栈结构
一个栈结构应该支持下面两个操作:
push(x): 将x放在栈的顶端
pop(): 将栈最上面的元素拿走并取出来得到它的值
先进后出,可以类比为搭积木或者上子弹
用列表实现:
class Stack(object):
def __init__(self):
self.__data = []
def push(self,x):
self.__data.append(x)
def pop(self):
return self.__data.pop()
s =Stack()
s.push(1)
s.push(2)
s.push(3)
s.push(4)
print(s.pop())
print(s.pop())
print(s.pop())
print(s.pop())
输出:
4
3
2
1
扩展:实现一个字典;
class Set(object):
"""docstring for Set"""
def __init__(self, data=[]):
self.__data = []
for item in data:
if item not in self.__data:
self.__data.append(item)
def add(self,x):
if x not in self.__data:
self.__data.append(x)
def get_all(self):
return self.__data
s=Set()
s.add(1)
s.add(2)
s.add(3)
s.add(3)
print(s.get_all())
输出:[1, 2, 3]