Python实现链表

Python实现链表

链表是一种非常灵活的数据组织技术,实现链表有多种不同的方式。首先来看单链表。
1.单向链接表
单向链接表的结点是一个二元组,形式如下图所示

表元素域下一节点链接域
#节点类的定义
class LNode:
	def __init__(self,elem, next_=None):
		self.elem = elem
		self.next = next_

单向链表的基本操作:

  • 创建空链表
  • 删除链表
  • 判断表是否为空
  • 表首插入元素
  • 一般插入元素
  • 表首删除元素
  • 一般删除元素

单链表类的实现
1.结点类LNode的简单使用方法

lnode = LNode(1)
p = lnode
for i in range(2,10):
	p.next = LNode(i)
	p = p.next

while p is not None:
	print(p.elem)
	p = p.next
	

为处理链表中出现的异常状态,现定义一个异常类型

class LinkListError(ValueError):
		pass

现基于结点类定义单链表对象的类

class SingleLink:
	    def __init__(self):
        	self.head = None
        
        #判断链表是否为空
        def is_empty(self):
        	return self.head is None
        
        #头部添加结点
        def prepend(self, elem):
        	node = LNode(elem)
        	node.next = self.head
        	self.head = node
        	#上述三句语句可简写为如下
        	#self.head = LNode(elem, self.head)
        
        #头部删除
        def pop(self):
        	if self.head is None:
        		raise LinkListError("no value")
        	e = self.head.elem
        	self.head = self.head.next
        	return e
		
		#尾部增加结点
		def append(self, elem):
			if self.head is None:
				self.head = LNode(elem)
			p = self.head
			while p.next:
				p = p.next
			p.next = LNode(elem)
		
		#删除最后一个结点
		def pop_last(self):
			if self.head is None:
				raise LinkNodeError("empty link")
			p = self.head
			if p.next is None:
				e = p.next.elem
				p = None
				return e
			while p.next.next:
				p = p.next:
			e = p.next.elem
			p.next = None
			return e
			
		#打印出所有结点中包含的值
		def printall(self):
			p = self.head
			while p.next:
				print(p.elem, end="->")
				p = p.next	

2.单向链接表变形
基础的单链表在尾端进行操作时,时间复杂度为O(n),现对单链表进行改造,使其在对尾端结点进行操作时,时间复杂度为O(1),图示如下:
在这里插入图片描述

class LinkList1(SingleLink):
	def __init__(self):
		SingleLink.__init__(self)
		self._rear = None
	
	#头部增加结点
	def prepend(self, elem):
		if self.head is None:
			self.head = LNode(elem)
			self._rear = self.head
		else:
			self.head = LNode(elem, self.head)
			
	#尾部增加结点
	def append(self, elem):
		if self.head is None:
			self.head = LNode(elem)
			self._rear = self.head
		else:
			self._rear.next = LNode(elem)
			self._rear = self._rear.next
		
	#删除尾结点
	def pop_last(self):
		if self.head is None:
			raise LinkListError("empty link...")
		p = self.head
		if p.next is None:
			e = self.head.elem
			self.head = None
			return e
		while p.next.next:
			p = p.next
		e = p.next
		p.next = None
		self._rear = p
		
		
			

2.双向链接表
区别与单链表,双向链表多了一个反向引用域,可在结点类的基础上进行派生

双链表的结点类

#双链表结点类
class DLNode(LNode):
	def __init__(self, elem, prev = None, next_ = None):
		LNode.__init__(self, elem, next_)
		self.prev = prev

双链表的实现

#双链表类
class DLList(LinkList1):
	def __init__(self):
		LinkList1.__init__(self)
	
	#头部增加结点
	def prepend(self, elem):
		p = DLNode(elem, None, self.head)
		if self.head is None:
			self.rear = p
		else:
			p.next.pre = p
		self.head = p

	#尾部增加
	def append(self, elem):
		p = DLNode(elem, self.rear, self.head)
		if self.head is None:
			self.head = p
		else:
			p.pre.next = p
		self.rear = p
		
	#删除首结点
	def pop(self):
		if self.head is None:
			raise 	LinkListError("empty link...")
	
		e = self.head.elem
		self.head = self.head.next
		if self.head:
			self.head.pre = None
		return e

	#删除尾节点
	def pop_last(self):
		if self.head is None:
			raise 	LinkListError("empty link...")
		
		e = self.rear.elem
		self.rear = self.rear.pre
		if self.rear:
			self.rear.next = None
#上述代码借鉴自裘宗燕老师的《数据结构与算法》Python语言描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是Python实现链表的示例代码: ```python # 定义链表节点类 class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next # 定义链表类 class LinkedList: def __init__(self): self.head = None # 在链表末尾添加节点 def addAtTail(self, val: int) -> None: if not self.head: self.head = ListNode(val) else: cur = self.head while cur.next: cur = cur.next cur.next = ListNode(val) # 在链表头部添加节点 def addAtHead(self, val: int) -> None: if not self.head: self.head = ListNode(val) else: new_head = ListNode(val) new_head.next = self.head self.head = new_head # 在指定位置添加节点 def addAtIndex(self, index: int, val: int) -> None: if index == 0: self.addAtHead(val) else: cur = self.head for i in range(index - 1): if not cur: return cur = cur.next if not cur: return new_node = ListNode(val) new_node.next = cur.next cur.next = new_node # 删除指定位置的节点 def deleteAtIndex(self, index: int) -> None: if not self.head: return if index == 0: self.head = self.head.next else: cur = self.head for i in range(index - 1): if not cur: return cur = cur.next if not cur or not cur.next: return cur.next = cur.next.next # 获取指定位置的节点值 def get(self, index: int) -> int: if not self.head: return -1 cur = self.head for i in range(index): if not cur: return -1 cur = cur.next if not cur: return -1 return cur.val # 打印链表 def printList(self) -> None: if not self.head: print("Empty List") else: cur = self.head while cur: print(cur.val, end=" ") cur = cur.next print() # 创建链表并测试 linked_list = LinkedList() linked_list.addAtHead(1) linked_list.addAtTail(3) linked_list.addAtIndex(1, 2) linked_list.printList() # 输出:1 2 3 linked_list.deleteAtIndex(1) linked_list.printList() # 输出:1 3 print(linked_list.get(1)) # 输出:3 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值