数据结构 | 单向链表学习总结

双向链表学习总结: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)
但是链表如此操作会报错。

链表的长度计算规则为:

  1. 计数:= 0
  2. 当节点不为空时,执行:
    数:=数+ 1
    节点:=节点的下一个
  3. 返回计数

程序如下:

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
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值