python实现单向链表

节点类的实现
class Node:
	def __init__(self,value,next=None):
		self.value = value
		self.next=next
链表类的实现
class Link:
    def __init__(self):
        self.pHead = Node(-1)  # 创建一个虚拟节点

    def get_length(self):  # 获取链表长度
        length = 0
        temp = self.pHead.next  # 定义一个临时变量,用来遍历链表
        while temp != None:
            length += 1
            temp = temp.next
        return length

    def is_empty(self):  # 判断链表是否为空
        empty = True
        if self.get_length() != 0:
            empty = False
        return empty


	def insert_node(self, k: int, value):  # 向x位置插入元素value
	    length = self.get_length()  # 获取长度
	    if k < 1 or k > (length + 1):
	        raise ValueError("the value of k is out range of link")
	    node = Node(value)  # 封装value
	    pre = self.pHead  # 用来标记插入位置的前一个元素
	    for i in range(1, k):  # 通过循环,将pre移动到插入位置的前一个元素
	        pre = pre.next
	    if k == 1:  # 向第一个位置插入元素,必然牵扯到最前面的虚拟节点的设置
	        temp = self.pHead.next
	        self.pHead.next = node  # 将self.pHead的下一个指向新插入元素
	        node.next = temp  # 将原来虚拟节点后面的元素接上
	    elif k > 1:
	        temp = pre.next  # 向后面元素插入元素,只需要设置其前一个位置的元素的next属性和其本身的next属性即可。
	        pre.next = node
	        node.next = temp
	
	
	def delete_node(self, value):  # 删除值为value的节点
	    locate = self.pHead
	    while locate.next != None:
	        if locate.next.value == value:  # 找到,执行删除操作
	            temp = locate.next
	            temp = temp.next  # 即指向了要删除的元素的下一个元素
	            locate.next = temp  # 让locate的下一个元素指向原来的下下个元素
	            break  # 退出循环
	        locate = locate.next
	
	
	def reserve_link(self):  # 反转此链表
	    temp = self.pHead.next
	    post = None
	    while temp != None:
	        pre = post
	        post = temp
	        temp = temp.next
	        post.next = pre
	    self.pHead.next = post
	
	
	def browser(self):  # 测试方法,用于浏览链表中的所有数据,
	    temp = self.pHead.next
	    while temp != None:
	        print(temp.value, end="")
	        temp = temp.next
	        if temp != None:
	            print(" -> ", end="")
	    print()
测试程序
# 测试程序
def test():
    link = Link()
    print("长度:",link.get_length()) #测试get_length()方法
    print("是否为空:",link.is_empty()) #测试is_empty()方法

    link.insert_node(1,15) #测试insert_value()方法
    link.insert_node(1,20) #20 15
    link.insert_node(2,30) #20 30 15
    link.insert_node(4,-5) #20 30 15 -5
    link.insert_node(4,144) #20 30 15 144 -5
    link.insert_node(6,88) #20 30 15 144 -5 88
    link.browser() #测试browser()方法
    # link.reserve_link() #测试reserve_link()方法
    link.delete_node(88) #测试delete_node()方法
    link.browser()

    print("长度:", link.get_length())  # 测试get_length()方法
    print("是否为空:", link.is_empty())  # 测试is_empty()方法

test() #程序入口
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值