常见数据结构(二)——链表
顺序表与链表都是线性表,但链表不像顺序表一样连续存储数据,而是在每一个节点(数据存储单元)里存放下一个节点的位置信息(即地址)。
三、单向循环链表
单链表的一个变形是单向循环链表,链表中最后一个节点的next域不再为None,而是指向链表的头节点。
class Node():
def __init__(self, item):
self.item = item
self.next = None
class SinCycLinkList(object):
def __init__(self, node=None):
self.__head = node
'''is_empty链表是否为空'''
def is_empty(self):
return self.__head == None
'''length()链表长度'''
def length(self):
if self.is_empty():
return 0
cur = self.__head
count = 1
while cur.next!= self.__head:
count += 1
cur = cur.next
return count
'''travel()遍历整个链表'''
def travel(self):
if self.is_empty():
return
cur = self.__head
while cur.next!=self.__head:
print(cur.item)
cur = cur.next
print(cur.item)
'''add(item)链表头部添加元素'''
def add(self, item):
node = Node(item)
if self.is_empty():
self.__head = node
node.next=node
else:
node.next = self.__head
cur=self.__head
while cur.next!=self.__head:
cur=cur.next
cur.next=node
self.__head = node
'''append(item)链表尾部添加元素'''
def append(self, item):
node = Node(item)
if self.is_empty():
self.__head = node
node.next=node
else:
cur = self.__head
while cur.next != self.__head:
cur = cur.next
cur.next = node
node.next = self.__head
'''insert(pos,item)指定位置添加元素'''
def insert(self, pos, item):
if pos <= 0:
self.add(item)
elif pos > (self.length() - 1):
self.append(item)
else:
node = Node(item)
count = 0
cur = self.__head
while count < (pos - 1):
count += 1
cur = cur.next
node.next = cur.next
cur.next = node
'''remove(item)删除节点'''
def remove(self, item):
if self.is_empty():
return
else:
cur = self.__head
prev=None
if cur.item == item:
if cur.next == self.__head:
self.__head = None
else:
cur=self.__head
while cur.next!=self.__head:
cur=cur.next
self.__head = self.__head.next
cur.next=self.__head
return
pre=self.__head
while cur.next!=self.__head:
if cur.item==item:
prev.next=cur.next
return
else:
prev=cur
cur = cur.next
if cur.item==item:
pre.next=cur.next
'''search(item)查找节点是否存在'''
def search(self, item):
if self.is_empty():
return False
cur = self.__head
if cur.item==item:
return True
while cur.next != self.__head:
cur = cur.next
if cur.item == item:
return True
return False
if __name__=='__main__':
ll=SinCycLinkList()
ll.add(1)
ll.add(2)
ll.append(3)
ll.insert(2,4)
ll.insert(4,5)
ll.insert(0,6)
print('length:',ll.length())
ll.travel()
print(ll.search(3))
print(ll.search(4))
ll.remove(1)
print('length:',ll.length())
ll.travel()
常见数据结构(三)——栈
栈(stack)是一种容器,可存入数据元素、访问元素、删除元素,它的特点在于只能允许在容器的一端(称为栈顶端指标)进行数据加入和输出数据的运算。
由于栈数据结构只允许在一端进行操作,因而按照后进先出的原理运作。
class Stack():
def __init__(self):
self.__list=[]
'''push(item)添加一个新的元素item到栈顶'''
def push(self,item):
self.__list.append(item)
'''pop()弹出栈顶元素'''
def pop(self):
return self.__list.pop()
'''peek()返回栈顶元素'''
def peek(self):
return self.__list[-1]
'''is_empty()判断栈是否为空'''
def is_empty(self):
return self.__list == []
'''size()返回栈的元素个数'''
def size(self):
return len(self.__list)
if __name__=='__main__':
stack=Stack()
stack.push('hello')
stack.push('world')
stack.push('itcast')
print(stack.size())
print(stack.peek())
print(stack.pop())
print(stack.pop())
print(stack.pop())
常见数据结构(四)——队列
队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。
队列是一种先进先出的线性表,简称FIFO。
class Queue():
def __init__(self):
self.__items=[]
'''enqueue(item)往队列中添加一个item元素'''
def enqueue(self,item):
self.__items.insert(0,item)
'''dequeue()从队列头部删除一个元素'''
def dequeue(self):
return self.__items.pop()
'''is_empty()判断栈是否为空'''
def is_empty(self):
return self.__items == []
'''size()返回队列的大小'''
def size(self):
return len(self.__items)
if __name__=='__main__':
queue=Queue()
queue.enqueue('hello')
queue.enqueue('world')
queue.enqueue('itcast')
print(queue.size())
print(queue.dequeue())
print(queue.dequeue())
print(queue.dequeue())
补充:双端队列
双端队列,是一种具有队列和栈的性质的数据结构。
双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行。双端队列可以在队列任意一端入队和出队。
class Deque():
def __init__(self):
self.__items=[]
'''add_front(item)从队头加入一个item元素'''
def add_front(self,item):
self.__items.insert(0,item)
'''add_rear(item)从队尾加入一个item元素'''
def add_rear(self,item):
self.__items.append(item)
'''remove_front()从队头删除一个item元素'''
def remove_front(self):
return self.__items.pop(0)
'''remove_rear()从队尾删除一个item元素'''
def remove_rear(self):
return self.__items.pop()
'''is_empty()判断双端队列是否为空'''
def is_empty(self):
return self.__items == []
'''size()返回队列的大小'''
def size(self):
return len(self.__items)
if __name__=='__main__':
deque=Deque()
deque.add_front(1)
deque.add_front(2)
deque.add_rear(3)
deque.add_rear(4)
print(deque.size())
print(deque.remove_front())
print(deque.remove_front())
print(deque.remove_rear())
print(deque.remove_rear())