Py&禅

博客园 首页 新随笔 联系 订阅 管理
# -*- coding:utf-8 -*-
"""
Created on 2010-5-21
单链表的实现 1
@author: Administrator
"""

class LinkedList(object):
    class Element(object):    
        '''
       
        定义元素,包含了数据内容_datum和指向下一元素的链接_next
        '''     
        def __init__(self,list,datum,next):  #用参数初始化新的节点.
            self._list = list   #标识自己属于哪一个list
            self._datum = datum    #元素value
            self._next = next   #下一节点的位置
   
        def getDatum(self):
            return self._datum
   
        datum = property(
            fget = lambda self: self.getDatum())
   
        def getNext(self):
            return self._next
   
        next = property(
                fget = lambda self: self.getNext())
       
    def __init__(self): #LinkedList 初始化
        self._head = None   #头
        self._tail = None   #尾
       
    def purge(self):    #链表清空,初始化为空链表
        self._head = None
        self._tail = None
       
    def gethead(self):
                return self._head
           
    head = property(
        fget = lambda self: self.getHead())
   
    def getTail(self):
        return self._tail
   
    tail = property(
        fget = lambda self: self.getTail())
   
    def IsEmpty(self):
        return self._head == None
   
    isEmpty = property(
        fget = lambda self: self.IsEmpty())
   
    def getFirst(self):
        if self._head is None:
            raise ContainerEmpty
        return self._head._datum
    first = property(
        fget = lambda self: self.getFirst())

    def getLast(self):
        if self._tail is None:
            raise ContainerEmpty
        return self._tail._datum
    last = property(
        fget = lambda self: self.getLast ())
   
    def prepend(self,item):  #用于将元素插入链表头,这样,插入后的元素变成新的链表头:
        tmp = self.Element (self,item,self._head)
        if self._head is None:
            self._tail = tmp
        self._head = tmp
   
    def append(self,item):
        tmp = Element(self,item,None)
        if self._head is None:
            self._head = tmp
        else:
            self._tail._next = tmp
        self._tail = tmp
   

    def __copy__(self):
        lst = LinkedList()
        ptr = self._head
        while ptr is not None:
            lst.append(ptr._datum)
            ptr = ptr._next
        return lst
   

    def extract(self,item):
        prePtr = ptr = self._head
        while ptr is not None and ptr._datum is not item:
            prePtr = ptr
            ptr = ptr._next
        if ptr is None:
            raise KeyError
        if ptr == self._head:
            self._head = ptr._next
        else:
            prePtr._next = ptr._next
        if ptr == self._tail:
            self._tail = prePtr
   
    def find(self,item):
        ptr = self._head
        while ptr is not None and ptr._datum is not item:
            ptr = ptr._next
        return ptr
   
    def findBySeq(self, seq):
        ptr = self._head
        _count = 0
        while ptr is not None and _count != seq:
            ptr = ptr._next
            _count += 1
        return ptr
       
   
    def getlenth(self):
        current = self.head
        len = 0
        _lastptr = tail
        while current is not _lastptr:
            len +=1
            current = current._next
        return len
    lenth = property(
                fget = lambda self: self.getlenth())       
   
    def insert(self, seq, item):
        if seq == 0:
            tmp = Element(self, item, None)
            self._head = tmp
        elif seq > self.lenth:
            raise OutOfRange
        elif seq == self.lenth:
            tmp = self.append(item)
        else:
            _preptr = findBySeq(seq)
            _nextptr = _preptr._next
            tmp = Element(self,item,_nextptr)
            _forward._next = tmp
        return tmp

posted on 2010-06-01 05:37  Py&禅  阅读(336)  评论(0)    收藏  举报