链表实现!
创建节点
class Node(object):
#链表的构造函数
def __init__(self, val):
self.val = val
#默认next属性的值是None
self.next = None
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-umemT1LB-16
79210780295)(C:\Users\86186\OneDrive\图片\本机照片\创建结点.png)]
创建链表
class MyLinkedList(object):
def __init__(self):
"""在这里初始化数据"""
#默认head属性的值是None
self.head = None
#默认size属性的值是0,因为初始结构链表时,没有元素,头节点是空节点
self.size = 0
下面展示一些 内联代码片
。
self.head = Node()
查询链表
--snip--
def get(self, index):
"""
获取链表中的第index个节点的值,如果index无效,则返回-1
:参数类型 index : int
: 返回类型: int
"""
#当需要寻找的地址超出了链表的范围时,返回-1表示无法找到
if index < 0 or index >= self.size:
return -1
#当所需的链表为空时,也返回-1表示无法找到元素
if self.head is None:
return -1
#从表头开始搜索直到搜索到相应的位置。由于链表不能和顺序表一样通过寻址的直接找到相应位置的元素,
#所以要逐个搜索
curr = self.head
for i in range(index):
curr = curr.next
return curr.val
在表头插入结点
--snip--
def addAtHead(self, val):
"""
在链表的第一个元素之前添加值val的节点
插入后,新节点将成为链表的第一个节点
:参数类型 val: int
:返回类型: void
"""
#创建一个Node类的对像并赋值给对像名为node的对象
node = Node(val)
#直接将node指向的下一个对象赋值为链表的头结点。此时node成了新的头结点
node.next = self.head
self.head = node
#记得把结点属性中的size(链表大小,即链表包含的元素数量)
self.size += 1
在表尾插入结点
--snip--
def addAtTail(self, val):
"""
将值为val的结点追加到链表的最后一个元素之后
:参数类型 val: int
:返回类型: void
"""
curr = self.head
#如果链表头是空的,就相当于这个链表是空的,则将val直接作为头结点
if curr is None:
self.head = Node(val)
#否则通过迭代找到当前链表的尾,并将链表尾指向的下一个对象赋值为新的结点
else:
while curr.next is not None:
curr = curr.next
curr.next = Node(val)
#链表中多了一个元素,链表属性中的size要自增1
self.size += 1
#在链表中的指定位置插入元素
在链表任意位置插入结点
#在链表中的指定位置插入元素
def addAtIndex(self, index, val):
"""
在链表中的索引结点之前添加值为val的结点
如果index等于链表的长度,则该结点将附加到链表的末尾
如果index大于链表的长度,则不会插入结点
:参数类型 index: int
: 参数类型 val: int
:返回类型:void
"""
#如果位置不合法, 地址超出了链表的范围,则直接停止添加并终止该方法
if index < 0 or index >self.size:
return
#如果在头结点, 调用addAtHead(val)方法即可
if index == 0:
self.addAtHead(val)
#如果在其他合法位置,则逐个遍历找到合适的位置
else:
curr = self.head
#curr遍历i-1个元素,目前curr是第i-1个元素
for i in range(index-1):
curr = curr.next
#然后将第i-1个结点指向node
node = Node(val)
#先将要插入的结点node指向插入的位置的下一个结点(index节点)
node.next = curr.next
#然后将第i-1个结点指向node
curr.next = node
#多了一个元素,size自增1
self.size += 1
删除任意位置的结点
--snip--
def deleteAtIndex(self,index):
"""
如果index是有效的,则删除链表中的第index个结点
:参数类型 index : int
:返回类型: void
"""
#如果位置不合法,地址超出了链表的范围,则直接停止添加并终止该方法
if index < 0 or index >= self.size:
return
curr = self.head
#如果要删除的是头结点,则直接将链表的头结点后移
if index == 0:
self.head = curr.next
#否则先找到要删除结点的前一个结点curr
else:
for i in range(index - 1)
curr = curr.next
#curr 指向要删除结点的下一个结点,这样就能删除要删除的结点了
curr.next = curr.next.next
#少了一个元素, size自减1
self.size -= 1