剧情提要:
阿伟看到了一本比较有趣的书,是关于《计算几何》的,2008年由北清派出版。很好奇
它里面讲了些什么,就来看看啦。
正剧开始:
星历2016年07月25日 09:40:00, 银河系厄尔斯星球中华帝国江南行省。
本节到此结束,欲知后事如何,请看下回分解。
阿伟看到了一本比较有趣的书,是关于《计算几何》的,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>
本节到此结束,欲知后事如何,请看下回分解。