双向链表学习总结:python | 双向链表
简介
今天打开力扣每日一题,遇到一个新的数据结构:链表。
本来每次力扣做题我都是在我自己的本地python调试,调试好后才提交到网上。但是今天遇到一个问题:力扣的测试用例写的是:[1,2,3,4,5]
,我在写测试用例的时候,也写了:input = [1,2,3,4,5]
,但是官方的程序竟然都通不过。
后来查找问题的时候才意识到,如果我以input = [1,2,3,4,5]
作为输入,那么程序认为输入是列表而不是链表。
做个个人的总结。介绍一下链表及其常见的用法。
总结
链表介绍
首先展示一下,在python中,链表和列表的区别:
从图中可以看出,链表和列表中同时保存1,3,2
几个数字。但是列表和链表的保存方式并不同。
总结来说(参见:python数据结构之链表),链表是通过一个个节点(Node)组成的,每个节点都包含了称为数据域(value)和指针域(next)的基本单元,它也是一种递归的数据结构。它能保持数据之间的逻辑顺序,但存储空间不必按照顺序存储。
链表定义
python没有自带的链表结构,需要自行定义。
程序如下:
class ListNode(object):
def __init__(self, x):
self.val = x
self.next = None
调用的用法如下:
l1 =
l1.val
l1.next.val
li.next.next.val
链表函数
计算链表的长度
列表的长度计算:len(list1)
但是链表如此操作会报错。
链表的长度计算规则为:
- 计数:= 0
- 当节点不为空时,执行:
数:=数+ 1
节点:=节点的下一个 - 返回计数
程序如下:
node = ListNode() # Node 为链表
count = 0
while node:
count +=1
node=node.next
print(n) # n表示链表的长度
将列表转换为链表
参见: python将列表转化为链表
class Solution:
def initList(self, data):
# 判断是否为空
if len(data) == 0:
return
else:
# 创建头结点
self.head = ListNode(data[0])
# 头结点
r = self.head
# 指针
p = self.head
# 逐个为 data 内的数据创建结点, 建立链表
for i in data[1:]:
node = ListNode(i)
p.next = node
p = p.next
return r
if __name__ == "__main__":
test = Solution()
data1 = [1, 3, 2]
l1 = test.initList(data1)
print(l1.val, "->", l1.next.val, "->", l1.next.next.val)
LeetCode:剑指 Offer 22. 链表中倒数第k个节点
问题:
看懂链表的结构后,这道题 就很非常好做了。
官方解答:
class Solution:
def getKthFromEnd(self, head: ListNode, k: int) -> ListNode:
node, n = head, 0
# 计算链表长度
while node:
node = node.next
n += 1
node = head
for _ in range(n - k):
node = node.next
return node