软件测试Python 链表实践

Python 链表实践

数据结构之链表

  1. 创建链表元素类
  2. 创建链表类
  3. 为链表类创建方法函数

1.创建链表元素类

链表是由一个个元素链接而成的。所以第一步,我们先创建一个链表元素类,来表示我们的链表上的元素。接着我们通过 __init__ 方法给它定义两个属性,self.valueself.next 。

class Element(object):
    def __init__(self, value):
        self.value = value
        self.next = None
复制代码

免费领取Python自动化学习资料  工具,面试宝典面试技巧,加QQ群,785128166,群内还会大佬技术交流

2.创建链表类

一个链表在最初被创建的时候,它至少需要一个元素。

链表是由元素链接而成,它的第一个元素,我们称它为头部元素。所以我们在__init__方法里给链表类定义了一个属性,self.head = head

class LinkedList(object):
	def __init__(self, head=None):
		self.head = head
复制代码

3.为链表类创建函数方法

我们将为链表类创建以上四个方法。

免费领取Python自动化学习资料  工具,面试宝典面试技巧,加QQ群,785128166,群内还会大佬技术交流


append方法

​ 在链表的后面增加一个元素。链表中不能像列表那样通过索引定位每个元素。所以需要不断调用 链表元素的.next方法来不断获取下一个元素,最后获取到最后一个元素。然后在最后一个元 素的.next属性里指向新增的元素。

def append(self, new_element):
	current = self.head
	if self.head:
		while current.next:
			current = current.next
		current.next = new_element
	else:
		self.head = new_element
复制代码

get_position方法

​ 获取链表中与传入参数对应的元素位置。例:get_position(1) 将会获取链表中第一个元素。

​ 这里我们依然需要通过循环调用.next属性来遍历链表。不同的是我们需要定义一个变量counter来记录我们遍历的链表元素顺序。我们还需要在传入的参数获取不到链表元素时返回None

def get_position(self, position):
	counter = 1
	current = self.head
	if position < 1:
		return None
	While current and counter <= position:
		if counter == position:
			return current
		current = current.next
		counter += 1
	return None
复制代码

insert方法

​ insert方法有两个参数,new_elementpositionnew_element表示要插入的元素,position表示要插入链表的位置。

​ 同样的我们需要使用循环,也需要counter来记录我们遍历链表的顺序。通常我们插入元素时,都是从链表的中间插入。所以先不考虑把元素插入链表头部的情况。现在我们来想象一下,假设我们想把元素new_element插入到链表中第三个位置,也就是position为3的时候,我们需要获取什么? 我们实际只需要获取到它的前一个元素(我们假设这个元素为element2),也就是position为2的元素,然后把element2.next赋值给new_element.next,然后再把new_element赋值给element2.next。于是,我们便完成了元素的插入,最后再考虑插入头部的情况,我们直接把self.head赋值给new_element.next

def insert(self, new_element, position):
	counter = 1
	current = self.head
	if position > 1:
		while current and counter < position:
			if counter == position - 1
				new_element.next = current.next
				current.next = new_element
			current = current.next
			counter += 1
	elif position == 1:
		new_element.next = self.head 
		self.head = new_element
复制代码

delete方法

​ delete删除一个value属性与传入参数“value”相同的元素。

​ 在链表中,要删除一个元素,只需要,把被删除元素前面一个元素指向到被删除元素的后一个元素。这里我们用previous来表示被删除元素的前一个元素。

def delete(self, value):
	current = self.head
	previous = None
	while current.value != value and current.next:
		previous = current
		current = current.next
	if current.value == value:
		if previous:
			previous.next = current.next
		else:
			self.head = current.next
复制代码

一个完整的示例

class Element(object):
    def __init__(self, value):
        self.value = value
        self.next = None

class LinkedList(object):
    def __init__(self, head=None):
        self.head = head

    def append(self, new_element):
        current = self.head
        if self.head:
            while current.next:
                current = current.next
            current.next = new_element
        else:
            self.head = new_element

    def get_position(self, position):
        counter = 1
        current = self.head
        if position < 1:
            return None
        while current and counter <= position:
            if counter == position:
                return current
            current = current.next
            counter += 1
        return None

    def insert(self, new_element, position):
        counter = 1
        current = self.head
        if position > 1:
            while current and counter < position:
                if counter == position - 1:
                    new_element.next = current.next
                    current.next = new_element
                current = current.next
                counter += 1
        elif position == 1:
            new_element.next = self.head
            self.head = new_element

    def delete(self, value):
        current = self.head
        previous = None
        while current.value != value and current.next:
            previous = current
            current = current.next
        if current.value == value:
            if previous:
                previous.next = current.next
            else:
                self.head = current.next
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值