# 定义节点classNode:def__init__(self, initdata):
self.data = initdata
self.next=NonedefgetNode(self):return self.data
defgetNext(self):return self.nextdefsetNode(self, newnode):
self.data = newnode
defsetNext(self, newnext):
self.next= newnext
classUnOrderedList:"""无序链表"""def__init__(self):
self.head =NonedefisEmpty(self):return self.head ==Nonedefadd(self, item):
temp = Node(item)
temp.setNext(self.head)
self.head = temp
defsize(self):
current = self.head
count =0while current !=None:
count +=1
current = current.getNext()return count
defsearch(self, item):
current = self.head
found =Falsewhile current !=Noneandnot found:if current == item:
found =Trueelse:
current = current.getNext()return found
defremove(self, item):
current = self.head
previous =None
found =Falsewhilenot found:if current.getData()== item:
found =Trueelse:
current = current.getNext()
previous = previous.getNext()if previous ==None:# 判断匹配的是不是第一个节点
self.head = item.getNext()else:
previous.setNext(item.getNext())classOrderedList:"""有序链表"""def__init__(self):
self.head =None# isEmpty、size、remove这些方法和节点的次序无关,所以和UnOrderedList一样defisEmpty(self):return self.head ==Nonedefsize(self):
current = self.head
count =0while current !=None:
count +=1
current = current.getNext()return count
defremove(self, item):
current = self.head
previous =None
found =Falsewhilenot found:if current.getData == item:
found =Trueelse:
current = current.getNext()
previous = previous.getNext()if previous ==None:
self.head = current.getNext()else:
previous.setNext(current.getNext())return self
defserach(self, item):
current = self.head
found =False
stop =Falsewhile current !=Noneandnot found andnot stop:if current.getData()== item:
found =Trueelif current.getData()> item:
stop =Trueelse:
current = current.getNext()return found
defadd(self, item):
current = self.head
previous =None
stop =Falsewhile current !=Noneandnot stop:if current.getData()> item:
stop =Trueelse:
current = current.getNext()
previous = previous.getNext()
temp = Node(item)
temp.setNext(current)if previous ==None:
self.head = temp
else:
previous.setNext(temp)
2 应用
2.1 回文词
from myDeque import Deque
defpalchecker(aString):
chardeque = Deque()for ch in aString:
chardeque.addRear(ch)
stillEqual =Truewhile chardeque.size()>1:
first = chardeque.removeFront()
last = chardeque.removeRear()if first != last:
stillEqual =Falsereturn stillEqual
2.2 热土豆问题
from myQueue import Queue
defhotPotato(nameList, num):
simqueue = Queue()for name in nameList:
simqueue.enqueue(name)while simqueue.size()>1:for i inrange(num):
simqueue.enqueue(simqueue.dequeue())
simqueue.dequeue()# 拿到热土豆的人剔除return simqueue.dequeue()print(hotPotato(['Bill','David','Susan','Jane','Kent','Brad'],7))
2.3 括号
from myStack import Stack
# 检查括号是否匹配# 依次检查符号串,如果是左括号:则放进栈里;如果是右括号:检查栈顶是否为相应的左括号,如果是则消掉。defchecker(symbolString):
s = Stack()dict={'(':')','[':']','{':'}'}for symbol in symbolString:if symbol indict.keys():
s.push(symbol)else:if(not s.isEmpty())anddict[s.top()]== symbol:
s.pop()else:returnFalseif s.isEmpty():returnTrueelse:returnFalse
2.4 进制转换
from myStack import Stack
# 十进制转换为二进制# 233 / 2 = 116...1,116 / 2 = 58...0,58 / 2 = 29...0,29 / 2 = 14...1,# 14 / 2 = 7...0,7 / 2 = 3...1,3 / 2 = 1...1,1 / 2 =0...1# 因此 233(十进制) = 11101001(二进制)(余数反转)# 1 * 2^7 + 1 * 2^6 + 1 * 2^5 + 0 * 2^4 + 1 * 2^3 + 0 * 2^2 + 0 * 2^1 + 1 * 2^0 = 233# 因此 11101001(二进制) = 233(十进制)deften2two(num):
remainder = Stack()while num:
remainder.push(num %2)
num = num //2
result =''whilenot remainder.isEmpty():
result = result +str(remainder.pop())print(result)# 十进制转换为八进制deften2eight(num):
remainder = Stack()while num:
remainder.push(num %8)
num = num //8
result =''whilenot remainder.isEmpty():
result = result +str(remainder.pop())print(result)# 十进制转换为16进制deften2sixteen(num):
index ='0123456789ABCDEF'
remainder = Stack()while num:
remainder.push(num %16)
num = num //16
result =''whilenot remainder.isEmpty():
result = result + index[remainder.pop()]print(result)