蓝桥杯备赛-基础训练(二)链表 day13
1、移除链表元素
题意:删除链表中等于给定值 val 的所有节点。
示例 1: 输入:head = [1,2,6,3,4,5,6], val = 6 输出:[1,2,3,4,5]
示例 2: 输入:head = [], val = 1 输出:[]
示例 3: 输入:head = [7,7,7,7], val = 7 输出:[]
在这之前,我还是简单的说说在Python中的链表,
因为作为Python小白,我一开始对于Python的链表是很不清晰的。
根据Python中的基本数据类型,很明显没有什么可以直接的表示链表,Python是允许用户自己定义数据类型的,这就是所说的类。
在这里我们就选用类作为链表的节点(链表有两部分,一个是数据域,一个是指针域)
在Python中,类的实例化实际上是创建一个对象,这个对象存储在内存中。当我们调用类的方法时,实际上是在操作这个对象的引用(地址),因此可以用类来表示链表的结点,即链表的结点类型是:用户自定义的类。
class ListNode:
def __init__(self,data):
self.valu = data #表示数据域
self.next = None #表示指针域
在我们已经表示了这个链表的节点以后,我们应该如何使用这个节点呢?
head = ListNode(1)
就是通过这个变量去指向这个节点,这个节点的指针域是空,
若我们希望在这个节点后添加节点,我们应该怎么做呢?
要给head所指向的这个节点的next(也就是指针域赋值)
赋什么值呢?
赋的就是想要添加的那个节点的地址
那么这个地址究竟等于什么呢?
这里用类来表示了
class ListNode:
def __init__(self,data):
self.valu = data #表示数据域
self.next = None #表示指针域
head = ListNode(1)
head.next = ListNode(123)
调试过后的结果如下:
如果还想要添加节点呢?
class ListNode:
def __init__(self,data):
self.valu = data #表示数据域
self.next = None #表示指针域
head = ListNode(1)
head.next = ListNode(123)
head = head.next
head.next = ListNode(456)
那大概知道了我们就开始正式的移除链表元素吧:
# 移除链表元素
# 初识链表
class ListNode:
def __init__(self,data):
self.value = data #表示数据域
self.next = None #表示指针域
# head = ListNode(1)
# head.next = ListNode(123)
# head = head.next
# head.next = ListNode(456)
dummy_head = ListNode(None)#这是虚拟的头结点
current = dummy_head #用current来指向虚拟头结点,current.next才是指向第一个节点
n = 10
num = 0
for _ in range(0,n):
current.next = ListNode(int(input("请输入数字:")))
current = current.next
x = int(input("请输入你想要移除的元素的数值:"))
current = dummy_head
while current.next:
if current.next.value==x:
current.next = current.next.next
num += 1
else:
current = current.next
current = dummy_head
while current:
print(current.value, end=" -> " if current.next else "")
current = current.next
关于最后的输出,给大家做个小小的解释:
current.value就是值的是值,而,后面的则指的是一个三元运算 如果current.next还有值,那么输出“->”,如果current.next已经是None了,那么就输出“”
2、设计链表
题意:
在链表类中实现这些功能:
- get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-1。
- addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的第一个节点。
- addAtTail(val):将值为 val 的节点追加到链表的最后一个元素。
- addAtIndex(index,val):在链表中的第 index 个节点之前添加值为 val 的节点。如果 index 等于链表的长度,则该节点将附加到链表的末尾。如果 index 大于链表长度,则不会插入节点。如果index小于0,则在头部插入节点。
- deleteAtIndex(index):如果索引 index 有效,则删除链表中的第 index 个节点。
# 设计链表
class ListNode:
def __init__(self,data=0,next=None):
self.value = data
self.next = next
# 定义类
class MylinkList:
def __init__(self):
self.dummy_head = ListNode()#虚拟头节点
self.size = 0
# 定义相关的函数
def get(self,index: int) -> int:
# 首先看index是不是合法的
if index<0 or index>=self.size:
return -1
else:
current = self.dummy_head.next #指向有值的第一个节点
for i in range(0, index):
current = current.next
return current.value
# 在头部增加一个值
def addAtHead(self,value:int)->None:
self.dummy_head.next = ListNode(value,self.dummy_head.next)
self.size +=1
# 在尾部增加一个值
def addAtTail(self,value:int)->None:
current = self.dummy_head
while current.next:# 注意,这里必须是检查current.next 因为如果检查current的话,就会变成current是一个None,
# 我们是不能修改None的值的
current = current.next
current.next = ListNode(value,None)
self.size += 1
# 在链表中的第index个节点之前添加值为value的节点
def addAtIndex(self,index:int, value:int)->None:
if index < 0 or index > self.size:
return
current = self.dummy_head
for i in range(0,index):
current = current.next
current.next = ListNode(value,current.next)
self.size +=1
# 在列表中指定删除某个值
def deleteAtIndex(self,index:int)->None:
if index < 0 or index > self.size:
return
current = self.dummy_head
for i in range(0,index):
current = current.next
current.next = current.next.next
self.size-=1
obj = MylinkList()#创立一个新的链表?
obj.addAtHead(11)
obj.addAtTail(100)
current = obj.dummy_head.next
while current.next:
print(current.value)
current = current.next
sub = obj.get(1)
current = obj.dummy_head.next
while current.next:
print(current.value)
current = current.next
obj.addAtTail(1)
obj.addAtTail(23)
current = obj.dummy_head.next
while current.next:
print(current.value)
current = current.next
obj.deleteAtIndex(2)
current = obj.dummy_head.next
while current.next:
print(current.value)
current = current.next