目录
一.链表
1.单向循环链表
代码
class Node:
def __init__(self,elem):
self.elem=elem
self.next=None
class SingleList:
def __init__(self,node=None):
self.__head=node
if node:
node.next=node
def is_empty(self):
return self.__head==None
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
def travel(self):
if self.is_empty():
return
cur=self.__head
while cur.next!=self.__head:
print(cur.elem,end="\t")
cur=cur.next
print(cur.elem)
def add(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
node.next=self.__head
self.__head=node
cur.next=self.__head
def append(self,item):
node=Node(item)
if self.__head==None:
self.__head=node
node.next=node
else:
cur=self.__head
while cur.next!=self.__head:
cur=cur.next
node.next=cur.next
cur.next=node
def insert(self,pos,item):
if pos < 0:
self.add(item)
elif pos>(self.length()-1):
self.append(item)
else:
node=Node(item)
pre=self.__head
count=0
while count<(pos-1):
count+=1
pre=pre.next
node.next=pre.next
pre.next=node
def remove(self,item):
if self.__head==None:
return
pre=None
cur=self.__head
while cur.next!=self.__head:
if cur.elem==item:
if cur==self.__head:
rear=self.__head
while rear.next!=self.__head:
rear=rear.next
self.__head=cur.next
rear.next=self.__head
else:
pre.next=cur.next
return
else:
pre=cur
cur=cur.next
if cur.elem==item:
if pre==None:
self.__head=None
else:
pre.next=self.__head
def search(self,item):
if self.is_empty():
return False
cur=self.__head
while cur.next!=self.__head:
if cur.elem==item:
return True
else:
cur=cur.next
if cur.elem==item:
return True
return False
if __name__=="__main__" :
ll=SingleList()
print(ll.is_empty())
print(ll.length())
ll.append(1)
print(ll.is_empty())
print(ll.length())
ll.append(2)
ll.append(3)
ll.append(4)
ll.append(5)
ll.append(6)
ll.add(8)
ll.travel()
ll.insert(-1,9)
ll.travel()
ll.insert(3,100)
ll.travel()
ll.insert(10,200)
ll.travel()
node=Node(5)
print(node)
print(ll._SingleList__head)
print("********************************")
ll.remove(9)
ll.travel()
ll.remove(200)
ll.travel()
运行结果
/Users/lichengxiang/Desktop/python/venv/bin/python /Users/lichengxiang/Desktop/python/数据结构和算法/单向循环链表.py
True
0
False
1
8 1 2 3 4 5 6
9 8 1 2 3 4 5 6
9 8 1 100 2 3 4 5 6
9 8 1 100 2 3 4 5 6 200
<__main__.Node object at 0x10519f890>
<__main__.Node object at 0x10519f7d0>
********************************
8 1 100 2 3 4 5 6 200
8 1 100 2 3 4 5 6进程已结束,退出代码0
2.双向链表
代码
class Node(object):
def __init__(self,item):
self.elem=item
self.next=None
self.prev=None
class DoubleLinkList(object):
def __init__(self, node=None):
self.__head = node
def is_empty(self):
return self.__head == None
def length(self):
cur = self.__head
count = 0
while cur != None:
count += 1
cur = cur.next
return count
def travel(self):
cur = self.__head
while cur != None:
print(cur.elem, end="\t")
cur = cur.next
print("")
def add(self, item):
node = Node(item)
node.next = self.__head
self.__head = node
node.next.prev=node
def append(self, item):
node = Node(item)
if self.__head == None:
self.__head = node
else:
cur = self.__head
while cur.next != None:
cur = cur.next
cur.next = node
node.prev=cur
def insert(self, pos, item):
if pos < 0:
self.add(item)
elif pos > (self.length() - 1):
self.append(item)
else:
node = Node(item)
pre = self.__head
count = 0
while count < (pos - 1):
count += 1
pre = pre.next
node.next = pre.next
pre.next = node
node.next.prev=node
node.prev=pre
def remove(self, item):
cur = self.__head
while cur != None:
if cur.elem == item:
if cur == self.__head:
self.__head = cur.next
if cur.next:#判断链表是否只有一个结点
cur.next.prev=None
else:
cur.prev.next = cur.next
if cur.next:
cur.next.prev=cur.prev
break
else:
cur = cur.next
def search(self, item):
cur = self.__head
while cur != None:
if cur.elem == item:
return True
else:
cur = cur.next
return False
if __name__ == "__main__":
ll=DoubleLinkList()
print(ll.is_empty())
print(ll.length())
ll.append(1)
print(ll.is_empty())
print(ll.length())
ll.append(2)
ll.append(3)
ll.append(4)
ll.append(5)
ll.append(6)
ll.add(8)
ll.travel()
ll.insert(-1,9)
ll.travel()
ll.insert(3,100)
ll.travel()
ll.insert(10,200)
ll.travel()
node=Node(5)
print(node)
print(ll._DoubleLinkList__head)
print("********************************")
ll.remove(9)
ll.travel()
ll.remove(200)
ll.travel()
运行结果
/Users/lichengxiang/Desktop/python/venv/bin/python /Users/lichengxiang/Desktop/python/数据结构和算法/双向链表.py
True
0
False
1
8 1 2 3 4 5 6
9 8 1 2 3 4 5 6
9 8 1 100 2 3 4 5 6
9 8 1 100 2 3 4 5 6 200
<__main__.Node object at 0x100eab750>
<__main__.Node object at 0x100eab690>
********************************
8 1 100 2 3 4 5 6 200
8 1 100 2 3 4 5 6进程已结束,退出代码0
二.栈
代码
class Stack(object):
def __init__(self):
self.__list=[]
def enqueue(self, item):
self.__list.append(item)
def dequeue(self):
return self.__list.pop()
def peek(self):
if self.__list:
return self.__list[-1]
else:
return None
def is_empty(self):
return self.__list==[]
def size(self):
return len(self.__list)
if __name__=="__main__":
s=Stack()
s.enqueue(1)
s.enqueue(2)
s.enqueue(3)
s.enqueue(4)
print(s.dequeue())
print(s.dequeue())
print(s.dequeue())
print(s.dequeue())
运行结果
/Users/lichengxiang/Desktop/python/venv/bin/python /Users/lichengxiang/Desktop/python/数据结构和算法/栈.py
4
3
2
1进程已结束,退出代码0
三.队列
1.队列
代码
class Queue(object):
def __init__(self):
self.__list=[]
def enqueue(self,item):
self.__list.append(item)
def dequeue(self):
return self.__list.pop(0)
def is_empty(self):
return self.__list==[]
def size(self):
return len(self.__list)
if __name__=="__main__":
s=Queue()
s.enqueue(1)
s.enqueue(2)
s.enqueue(3)
s.enqueue(4)
print(s.dequeue())
print(s.dequeue())
print(s.dequeue())
print(s.dequeue())
运行结果
/Users/lichengxiang/Desktop/python/venv/bin/python /Users/lichengxiang/Desktop/python/数据结构和算法/队列.py
1
2
3
4进程已结束,退出代码0
2.双端队列
代码
class Deque(object):
def __init__(self):
self.__list = []
def add_front(self, item):
self.__list.insert(0,item)
def add_rear(self, item):
self.__list.append(item)
def pop_front(self):
return self.__list.pop(0)
def pop_rear(self):
return self.__list.pop()
def is_empty(self):
return self.__list == []
def size(self):
return len(self.__list)
if __name__ == "__main__":
s = Deque()
s.add_front(1)
s.add_front(2)
s.add_rear(3)
s.add_rear(4)
print(s.pop_front())
print(s.pop_front())
print(s.pop_rear())
print(s.pop_rear())
运行结果
/Users/lichengxiang/Desktop/python/venv/bin/python /Users/lichengxiang/Desktop/python/数据结构和算法/双端队列.py
2
1
4
3进程已结束,退出代码0