[从头学数学] 第246节 Python实现数据结构:链表

剧情提要:
阿伟看到了一本比较有趣的书,是关于《计算几何》的,2008年由北清派出版。很好奇
它里面讲了些什么,就来看看啦。


正剧开始:
星历2016年07月25日 09:40:00, 银河系厄尔斯星球中华帝国江南行省。

[工程师阿伟]正在和[机器小伟]一起研究[计算几何]]。






<span style="font-size:18px;">###
# @usage   单向链表
# @author  mw
# @date    2016年07月25日  星期一  09:41:23 
# @param
# @return
#
###
class LinkedList:
    def info(self):
        s = '[';
        for x in self:
            s+=str(x)+', ';

        s = s[:-2]+']';
        print(s);

    def __len__(self):
        return self.numItems;
        
    def __iter__(self):
        cursor = self.first.getNext();
        for i in range(self.numItems):            
            yield cursor.getItem();
            cursor = cursor.getNext();    

        
    # This class is used internally by the LinkedList class. It is
    # invisible from outside this class due to the two underscores
    # that precede the class name. Python mangles names so that they
    # are not recognizable outside the class when two underscores
    # precede a name but aren’t followed by two underscores at the
    # end of the name (i.e. an operator name).
    class __Node:
        def __init__(self,item,next=None):
            self.item = item
            self.next = next
        def getItem(self):
            return self.item
        def getNext(self):
            return self.next
        def setItem(self, item):
            self.item = item
        def setNext(self,next):
            self.next = next
    
    def __init__(self,contents=[]):
        # Here we keep a reference to the first node in the linked list
        # and the last item in the linked list. They both point to a
        # dummy node to begin with. This dummy node will always be in
        # the first position in the list and will never contain an item.
        # Its purpose is to eliminate special cases in the code below.
        self.first = LinkedList.__Node(None,None)
        self.last = self.first
        self.numItems = 0
        
        for e in contents:
            self.append(e)

    def __getitem__(self,index):
        if index >= 0 and index < self.numItems:
            cursor = self.first.getNext()
            for i in range(index):
                cursor = cursor.getNext()
            return cursor.getItem()
        raise IndexError("LinkedList index out of range")

    def __setitem__(self,index,val):
        if index >= 0 and index < self.numItems:
            cursor = self.first.getNext()
            for i in range(index):
                cursor = cursor.getNext()
            cursor.setItem(val)
            return
        raise IndexError("LinkedList assignment index out of range")

    def __add__(self,other):
        if type(self) != type(other):
            raise TypeError("Concatenate undefined for " + \
                            str(type(self)) + " + " + str(type(other)))
        result = LinkedList()
        cursor = self.first.getNext()
        while cursor != None:
            result.append(cursor.getItem())
            cursor = cursor.getNext()
            
        cursor = other.first.getNext()
        while cursor != None:
            result.append(cursor.getItem())
            cursor = cursor.getNext()
        return result

    def append(self,item):
        node = LinkedList.__Node(item)
        self.last.setNext(node)
        self.last = node
        self.numItems += 1

    def insert(self,index,item):
        cursor = self.first
        if index < self.numItems:
            for i in range(index):
                cursor = cursor.getNext()
            node = LinkedList.__Node(item, cursor.getNext())
            cursor.setNext(node)
            self.numItems += 1
        else:
            self.append(item)

    def __delitem__(self, index):
        cursor = self.first;
        if index <= self.numItems:
            for i in range(index):
                cursor = cursor.getNext()
            cursor_ = cursor.getNext();
            cursor.setNext(cursor_.getNext())
            cursor_.setItem(None);
            cursor_.setNext(None);
            self.numItems -= 1

        return;

    def delete(self, index):
        del self[index];

    def __eq__(self,other):  
        if type(other) != type(self):  
            return False  
  
        if self.numItems != other.numItems:  
            return False  

        cursor1 = self.first;
        cursor2 = other.first;
        
        for i in range(self.numItems):             
            if cursor1.getItem() != cursor2.getItem():  
                return False

            cursor1 = cursor1.getNext();
            cursor2 = cursor2.getNext();
  
        return True 

    def __contains__(self,item):
        cursor = self.first;
        for i in range(self.numItems):  
            if cursor.getItem() == item:  
                return True

            cursor = cursor.getNext();
  
        return False

    def find(self, item, start = 0):
        cursor = self.first;
        for i in range(self.numItems):
            cursor = cursor.getNext();
            if (i >= start):
                if cursor.getItem() == item:  
                    return i;
  
        return -1;
        
    def __str__(self):
        s = '[';
        for x in self:
            s+=repr(x)+', ';

        s = s[:-2]+']';

        return s;

    def __repr__(self):
        s ='LinkedList([';

        for x in self:
            s+=repr(x)+', ';

        s = s[:-2]+'])';

        return s;</span>


用例:

<span style="font-size:18px;">def main():
    ll = LinkedList(range(10));
    ll2 = LinkedList(range(-10, 10, 2));
    ll3 = LinkedList(range(-10, 10, 2));

    #计时开始
    startTime = time.clock();

    ll.info();
    ll2.info();

    ll += ll2;
    ll.info();

    ll.insert(10, 500);
    ll.info();

    print(ll[3]);
    print(len(ll));
    ll.delete(3);

    ll.info();
    print(ll == ll2);
    print(ll2 == ll3);

    
    pos = ll.find(500);
    print(pos);

    pos = ll.find(0);
    print(pos);

    
    pos = ll.find(8, 10);
    print(pos);

    print(len(ll));

    print(str(ll));
    print(repr(ll));
    
    
    
    #计时结束
    endTime = time.clock();


    #打印结果
    print('操作用时:{0:.3e} s'.format(endTime-startTime));
</span>

本节到此结束,欲知后事如何,请看下回分解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值