一.数组:
1.顺序存储
2.长度不可变化
3.可以通过索引下标找到相关元素
4.不适合插入操作
注:python的列表像个动态的数组,长度不固定(可以使用插入等方法)
简易数组实现:
class Array(object): def __init__(self,data): self.__data = data def __str__(self): return str(self.__data) def __getitem__(self, item): return self.__data[item] def length(self): return self.__data.__len__() def __setitem__(self, key, value): self.__data[key] = value if __name__ == '__main__': a = Array([2,3,4]) print(a[2]) print(a[::-1]) print(a.length()) a[2] = 99 print(a)
二.链表:
1.不按顺序存储,可以不连续
2.长度可以变化
3.无法通过索引找到相关元素
4.适合做插入操作
注:不像数组,插入时要动用别的元素的位置
单链表的优点是插入和删除,缺点是查询
#定义一个基于节点类的单链表对象类 class LNode: def __init__(self,elem,_next=None): self.elem=elem self.next=_next class Myexception(Exception): def __init__(self,msg): self.msg = msg def __str__(self): return self.msg class LList: def __init__(self): self._head=None def is_empty(self): return self._head is None def prepend(self,elem): self._head=LNode(elem,self._head) def pop(self): if self._head is None: raise Myexception('no head') e, self._head = self._head.elem,self._head.next return e def append(self,elem): if self._head is None: self._head=LNode(elem) return p=self._head while p.next is not None: p=p.next p.next=LNode(elem) def pop_last(self): if self._head is None: raise ('in pop_last') p=self._head if p.next is None: e=p.elem self._head=None return e while p.next.next is not None: p=p.next e=p.next.elem p.next=None return p def find(self,pred): p=self._head while p is not None: if pred(p.elem): return p.elem p=p.next def __str__(self): p=self._head while p is not None: print(p.elem) print('end') p=p.next
if __name__ =='__main__': mlist1=LList() print(mlist1.is_empty()) for i in range(11,20): mlist1.append(i) mlist1.pop() print(mlist1)