链表是一种比较基础的数据结构,通过顺序连接的方式存储数据。链表有单链表,双向链表,循环链表等。
对于单链表,其每个节点存储了节点元素值和下一个邻接节点的指针,通过交替指向下一个节点可以遍历整个链表。
class IList: __metaclass__=ABCMeta @abstractmethod def Insert(self,index,element):pass @abstractmethod def Update(self,index,element):pass @abstractmethod def Delete(self,element):pass @abstractmethod def GetData(self,index):pass @abstractproperty def Length(self):pass @abstractmethod def Find(self,element):pass @abstractproperty def IsEmpty(self):pass @abstractmethod def Sort(self):pass @abstractmethod def Display(self):pass
IList定义了链表的基本操作
from IList import IList from Node import Node ''' 单链表 ''' class SingleLinkList(IList): def __init__(self): self.__current=None self.__end=None self.__head=None self.__size=0 ''' location index node ''' def __locationNode(self,index): if(index==None): self.__current=self.__end return self.__current=self.__head while(self.__current and index>0): self.__current=self.__current.Next index-=1 def Insert(self,index=None,element=None): self.__locationNode(index) node=Node(element) #list have no node if(self.__size==0): self.__current=self.__end=self.__head=node else: #new node's next node is current's next node.Next=self.__current.Next #new node's previous node is current node self.__current.Next=node #insert at end of list,End need move on if(self.__current==self.__end): self.__end=self.__end.Next #increases size self.__size+=1 def Update(self,index,element): self.__locationNode(index) self.__current.Element=element def Delete(self,element): if(self.IsEmpty()): return True #only one node if(self.__head==self.__end and self.__head.Element==element): self.__head=self.__end=None return True #more than two nodes node = self.__head lnode = node.Next while(lnode): if(lnode.Element==element): node.Next=node.Next.Next lnode = node.Next self.__size-=1 else: node=lnode lnode=node.Next self.__end=node #check first node if(self.__head.Element==element): if(self.__head.Next): self.__head=self.__head.Next else: self.__head=self.__end=self.__current=None self.__size-=1 def GetData(self,index): self.__locationNode(index) return self.__current.Element def Length(self): return self.__size def Find(self,element): node=self.__head index=0 while(node): if(node.Element==element):return index index+=1 node=node.Next return -1 def IsEmpty(self): if(self.__size==0):return True else:return False def Sort(self): temp=self.Display() from Algorithm.Sort import quicksort quicksort(temp,0,len(temp)-1) node=self.__head i=0 while(node): node.Element=temp[i] node=node.Next i+=1 def Display(self): node=self.__head temp=[] while(node): temp.append(node.Element) node=node.Next return temp
调用
from LinkList import SingleLinkList if __name__ == "__main__": #single linknode sinLList=SingleLinkList() sinLList.Insert(element=6) sinLList.Insert(element=13) sinLList.Insert(element=6) sinLList.Insert(element=0) print sinLList.Display() print '%s position %s in linklist'%(sinLList.Find(element=13),13) sinLList.Update(1, 15) print '%s position %s in linklist'%(1,sinLList.GetData(1)) sinLList.Sort() print 'after sort:%s'%sinLList.Display() sinLList.Delete(6) print sinLList.Display() output:[6, 13, 6, 0] 1 position 13 in linklist 1 position 15 in linklist after sort:[0, 6, 6, 15] [0, 15]
对于单链表的遍历的时间复杂度在O(N),最坏的情况是需要操作的节点刚好位End指向的节点上,必须用head循环到尾部进行操作。所以,基于这样的情况,双向链表可以很好的解决这个问题,双向链表中的每个节点包含了元素值,邻接节点的上一个节点指针、下一个节点指针,这样遍历即可前向,也可后向。
...