2025年6月4日 星期三 乙巳(蛇)年 三月初八 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > Python

Python Linked List 链表 数据结构

时间:12-14来源:作者:点击数:8
城东书院 www.cdsy.xyz

单向链表:

  • class listNode: # 链表中的结点
  • def __init__(self, x):
  • self.val = x
  • self.next = None
  • class LinkedList: # 链表类
  • def __init__(self):
  • self.head = None
  • l1 = LinkedList()
  • l1.add(1)
  • l1.add(2)

size() —— 返回链表中数据元素的个数/链表长度

  • def size(self):
  • size = 0
  • head = self.head
  • while head:
  • size += 1
  • head = head.next
  • return size

empty() —— 若链表为空则返回一个布尔值 true

  • def empty(self):
  • return True if self.head else False

value_at(index) —— 返回第 n 个元素的值(从0开始计算),若索引超过链表长度则报错

  • def value_at(self, index):
  • if not self.head:
  • raise IndexError("Index out of range.")
  • head = self.head
  • while index > 0:
  • if not head:
  • raise IndexError("Index out of range.")
  • head = head.next
  • index -= 1
  • return head.val

add(value) —— 添加元素到链表的首部

  • def add(self, value):
  • new_node = listNode(value)
  • new_node.next = self.head
  • self.head = new_node

pop_front() —— 删除首部元素并返回其值,若链表为空则报错

  • def pop_front(self):
  • if not self.head:
  • raise IndexError("Pop from empty list")
  • value = self.head.val
  • self.head = self.head.next
  • return value

append(value) —— 添加元素到链表的尾部

  • def append(self, value):
  • new_node = listNode(value)
  • if not self.head:
  • self.head = new_node
  • return
  • head = self.head
  • while head.next:
  • head = head.next
  • head.next = new_node

pop_back() —— 删除尾部元素并返回其值,若链表为空则报错

  • def pop_back(self):
  • if not self.head:
  • raise IndexError("Pop from empty list")
  • if not self.head.next:
  • value = self.head.val
  • self.head = None
  • return value
  • head = self.head
  • while head.next.next:
  • head = head.next
  • value = head.next.val
  • head.next = None
  • return value

front() —— 返回首部元素的值,若链表为空则报错

  • def front(self):
  • if not self.head:
  • raise ValueError("Linked list is empty")
  • return self.head.val

back() —— 返回尾部元素的值,若链表为空则报错

  • def back(self):
  • if not self.head:
  • raise ValueError("Linked list is empty")
  • head = self.head
  • while head.next:
  • head = head.next
  • return head.val

insert(index, value) —— 插入值到指定的索引,若索引超出链表长度则报错

  • def insert(self, index, value):
  • if not self.head:
  • raise IndexError("Index out of range")
  • head = self.head
  • new_node = listNode(value)
  • if index == 0:
  • new_node.next = head
  • self.head = new_node
  • return
  • while index - 1 > 0:
  • head = head.next
  • if not head:
  • raise IndexError("Index out of range")
  • index -= 1
  • temp = head.next
  • head.next = new_node
  • new_node.next = temp

erase(index) —— 删除指定索引的节点,若索引超出链表长度则报错

  • def erase(self, index):
  • if not self.head:
  • raise IndexError("Index out of range")
  • head = self.head
  • if index == 0:
  • self.head = head.next
  • while index - 1 > 0:
  • index -= 1
  • head = head.next
  • if not head:
  • raise IndexError("Index out of range")
  • temp = head.next
  • head.next = temp.next

reverse() —— 逆序链表

  • def reverse(self):
  • prev = None
  • head = self.head
  • while head:
  • temp = head.next
  • head.next = prev
  • prev = head
  • head = temp
  • self.head = prev

remove(value) —— 删除链表中指定值的第一个元素

  • def remove(self,value):
  • if not self.head:
  • return
  • head = self.head
  • if head.val == value:
  • self.head = head.next
  • return
  • while head.next:
  • if head.next.val == value:
  • temp = head.next.next
  • head.next = temp
  • return
  • head = head.next

时间复杂度:

  • 在链表的首部插入/移除结点、获得链表首部的值,都是 O(1) 时间复杂度
  • 获取/移除/插入任一结点、尾部结点,都是 O(n) 时间复杂度
城东书院 www.cdsy.xyz
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门
本栏推荐