python - 线性数据结构

单链表

单链表是一种基本的数据结构,链表中每个节点里存放该节点的值和下一个节点的位置信息。


在这里插入图片描述

节点定义:

class SingleNode(object):
	def __init__(self, item):
		self.item = item
		self.next = None

单链表的常用操作:

  • is_empty():链表是否为空
  • length():链表长度
  • travel():遍历链表
  • add(item):链表头部添加元素
  • append(item):链表尾部添加元素
  • insert(pos, item):在指定位置添加元素
  • remove(pos, item):删除节点
  • search(item):查找结点是否存在

单链表定义: 指定头结点并设为None

class SingleLinkList(object):
 """单链表"""
 def __init__(self):
     self._head = None

判空、链表长度

def is_empty(self):
     return self._head is None

 def length(self):
     # cur初始时指向头节点
     cur = self._head
     count = 0
     # 尾节点指向None,当未到达尾部时
     while cur is not None:
         count += 1
         # 将cur后移一个节点
         cur = cur.next
     return count

遍历链表

 def travel(self):
     cur = self._head
     while cur is not None:
         print(cur.item, end=" ")
         cur = cur.next
     print()

链表头部插入元素

 def add(self, item):
     # 先创建一个保存item节点的值
     node = SingleNode(item)
     # 将新节点的链接域next指向头节点,即_head指向的位置
     # 先连接再设置头节点指针 
     node.next = self._head
     # 将链表的头_head指向新节点
     self._head = node
 

示意图:


在这里插入图片描述

尾部添加元素

def append(self, item):
     """尾部添加元素"""
     node = SingleNode(item)
     # 先判断链表是否为空,若是空链表,则将_head指向新节点
     if self.is_empty():
         self._head = node
     # 若不为空,则找到尾部,将尾节点的next指向新节点
     else:
         cur = self._head
         while cur.next is not None:
             cur = cur.next
         cur.next = node

指定位置插入元素

 def insert(self, index, item):
     """指定位置添加元素"""
     # 若指定位置pos为第一个元素之前,则执行头部插入
     if index <= 0:
         self.add(item)
     # 若指定位置超过链表尾部,则执行尾部插入
     elif index > (self.length() - 1):
         self.append(item)
     # 找到指定位置
     else:
         node = SingleNode(item)
         count = 0
         # pre用来指向指定位置pos的前一个位置pos-1,初始从头节点开始移动到指定位置
         pre = self._head
         while count < (index - 1):
             count += 1
             pre = pre.next
         # 先将新节点node的next指向插入位置的节点
         node.next = pre.next
         # 将插入位置的前一个节点的next指向新节点
         pre.next = node

示意图:


在这里插入图片描述

删除节点

 def remove(self, item):
     """删除节点"""
     cur = self._head
     pre = None
     while cur is not None:
         # 找到了指定元素
         if cur.item == item:
             # 如果第一个就是删除的节点
             if not pre:
                 # 将头指针指向头节点的后一个节点
                 self._head = cur.next
             else:
                 # 将删除位置前一个节点的next指向删除位置的后一个节点
                 pre.next = cur.next
             break
         else:
             # 继续按链表后移节点
             pre = cur
             cur = cur.next

示意图:


在这里插入图片描述

查找指定元素

def search(self, item):
     """链表查找节点是否存在,并返回True或者False"""
     cur = self._head
     while cur is not None:
         if cur.item == item:
             return True
         cur = cur.next
     return False

双链表

# 双向链表节点定义
class Node(object):
 def __init__(self, item):
     self.item = item
     self.next = None
     self.prev = None

# 双向链表 
class DLinkList(object):
 def __init__(self):
     self._head = None

# 判空
 def is_empty(self):
     return self._head == None

# 链表长度
 def length(self):
    cur = self._head
     count = 0
     while cur is not None:
         count += 1
         cur = cur.next
     return count

# 遍历链表
 def travel(self):
     cur = self._head
     while cur is not None:
         print(cur.item, end=" ")
         cur = cur.next
     print("")

# 头部插入元素
 def add(self, item):
     node = Node(item)
     if self.is_empty():
         # 如果是空链表,将_head指向node
         self._head = node
     else:
         # 将node的next指向_head的头节点
         node.next = self._head
         # 将_head的头节点的prev指向node
         self._head.prev = node
         # 将_head 指向node
         self._head = node

# 尾部插入元素
 def append(self, item):
     node = Node(item)
     if self.is_empty():
         # 如果是空链表,将_head指向node
         self._head = node
     else:
         # 移动到链表尾部
         cur = self._head
         while cur.next is not None:
             cur = cur.next
         # 将尾节点cur的next指向node
         cur.next = node
         # 将node的prev指向cur
         node.prev = cur

# 查找指定元素
 def search(self, item):
     cur = self._head
     while cur is not None:
         if cur.item == item:
             return True
         cur = cur.next
     return False

# 指定位置添加节点
def insert(self, pos, item):
     if pos <= 0:
         self.add(item)
     elif pos > (self.length() - 1):
         self.append(item)
     else:
         node = Node(item)
         cur = self._head
         count = 0
         # 移动到指定位置的前一个位置
         while count < (pos - 1):
             count += 1
             cur = cur.next
         # 将node的prev指向cur
         node.prev = cur
         # 将node的next指向cur的下一个节点
         node.next = cur.next
         # 将cur的下一个节点的prev指向node
         cur.next.prev = node
         # 将cur的next指向node
         cur.next = node

# 移除指定元素     
def remove(self, item):
     if self.is_empty():
         return
     else:
         cur = self._head
         if cur.item == item:
             # 如果首节点的元素即是要删除的元素
             if cur.next == None:
                 # 如果链表只有这一个节点
                 self._head = None
             else:
                 # 将第二个节点的prev设置为None
                 cur.next.prev = None
                 # 将_head指向第二个节点
                 self._head = cur.next
             return
         while cur != None:
             if cur.item == item:
                 # 将cur的前一个节点的next指向cur的后一个节点
                 cur.prev.next = cur.next
                 # 将cur的后一个节点的prev指向cur的前一个节点
                 cur.next.prev = cur.prev
                 break
             cur = cur.next

栈是一种先入后出的数据结构,使用python中的list可以很方便的用来构建栈,list的append()和pop()可以表示入栈和出栈。

class Stack(object):
 def __init__(self):
     self.items = []

 def is_empty(self):
     return self.items == []

# 入栈
 def push(self, item):
     self.items.append(item)

# 出栈
 def pop(self):
     return self.items.pop()

# 返回栈顶元素
 def peek(self):
     return self.items[len(self.items) - 1]

# 栈大小
 def size(self):
     return len(self.items)

队列

队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。队列是一种先进先出的(First In First Out)的线性表,允许插入的一端为队尾,允许删除的一端为队头。队列不允许在中间部位进行操作。

class Queue(object):
 def __init__(self):
     self.items = []

 def is_empty(self):
     return self.items == []
 
 # 入队
 def enqueue(self, item):
     self.items.insert(0, item)
 # 出队
 def dequeue(self):
     return self.items.pop()

 def size(self):
     return len(self.items)

双端队列

class Deque(object):
 """双端队列"""

 def __init__(self):
     self.items = []
 # 判断队列是否为空
 def is_empty(self):
     return self.items == []
     
 # 在队头添加元素
 def add_front(self, item):
     self.items.insert(0, item)

 # 在队尾添加元素
 def add_rear(self, item):
     self.items.append(item)

 # 从队头删除元素
 def remove_front(self):
     return self.items.pop(0)

 # 从队尾删除元素
 def remove_rear(self):
     return self.items.pop()
     
 # 队列大小
 def size(self):
     return len(self.items)
发布了295 篇原创文章 · 获赞 103 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/Forlogen/article/details/104849438