参考文章http://blog.csdn.net/qq490691606/article/details/49945287
链表是一种 动态数据结构,他的特点是用一组任意的存储单元存放数据元素。链表中每一个元素成为“结点:node”,每一个结点都是油数据域和指针组成的,跟 数组不同的是,链表不用预先定义大小。与数组的不同:
1.数组需要预先设定大小,无法适应数据动态的增减,数据小于定义的长度会浪费内存,数据超过预定的长度无法插入。而链表是动态增删数据,可以随意增加。
2数组使用与获取元素的操作,直接get索引即可,链表对于获取元素比较麻烦,需要从头一直寻找,但是使用与增删,直接修改结点的指向即可,但是对于数据就比较麻烦,例如需要在[1,2,3,4]下标为1的位置插入-2,需要将【2 3 4】后移,赋值ls[1]=-2
3数组从栈中分配内存,对于程序员方便快速,但是自由度小,而链表从堆中分配内存,自由度大但是申请管理比较麻烦。
链表的基本实现方法:
初始化链表
翻转单向链表
Class ListNode(Object):
def __init__(self,val,next=None):
self.val=val
self.next=next
def display_list(head):
vals=[]
while head:
vals.append(str(head.val))
head=head.next
else:
print("-->".join(vals))
def reverse(head):#反转链表
new_head=None
while head:
node=head
head=head.next
node.next=new_head
new/-head=node
return new_head
#获取链表长度
def __len__(self):
pre=self.head
length=0
while pre:
length+=1
pre=pre.next
return length
#追加结点
如果head结点不存在,则当前节点为head结点,否则的话找到尾结点,将尾结点的next指向当前结点可以添加head和tail两个结点,就不用递归寻找尾结点
def append(self,data)
node=Node(data)
if self.head is None:
self.head=node;
else:
pre=self.head
while pre.next:
pre=pre.next
pre.next=node
#python使用@property可以将python定义的函数“当做”属性访问,从而提供更加友好访问方式
import traceback
class Screen(object):
def __init__(self,width,hight):
self.__width=width
self.__hight=hight
@property
def width(self):
return self.__width
@width.setter
def width(self,value):
self.__width=value
@property
def hight(self):
return self.__hight
@hight.setter
def hight(self,value):
self.__hight=value
@property
def resolution(self):
return self.__hight*self.__hight
s=Screen(1024,768)
print(s.resolution)
s.width=75
s.hight=23
print(s.resolution)
try:
s.width='abc'
except ValueError:
traceback.print_exc()
try:
s.resolution=990
except AttributeError:
traceback.print_exc()