如何在Python中创建与使用链表(单链表)

article/2025/9/30 10:39:17

如何在Python中创建与使用链表(单链表)


最近用Python语言在Leetcode中刷题,接触到不少关于链表的题,学校目前还没有开设数据结构的课程(开设的话应该也是以C/C++语言写的)。

因为不太了解链表使用方式,开始跳过了这些题,不过后来还是自己研究了一下,大概是了解了,看到评论区也有人不知道链表的使用方式,就打算总结一下。

首先来看一下Leetcode官方定义的链表:

# Definition for singly-linked list.
class ListNode(object):def __init__(self, val=0, next=None):self.val = valself.next = next

第一行说明了这是对单链表的定义。
其中链表元素只有两个属性,即valnext,前者代表当前原色的值,后者代表着这个元素指向的下一元素。next=None说明next的默认指向None

创建一个链表

可以使用如下方式:

head = None
for i in [4,3,2,1,0]:head = ListNode(i,head)

首先让表头(最终会是最后一个元素)指向None,然后利用for循环依次添加这个链结的前一个元素。因此,最终获得的链表会是这样的:

遍历一个链表

value = []
head2 = head
while head:value.append(head2.val)head2 = head2.next

这里使用一个列表来保存链表中元素的值。
在每次获取head的值之后,向前移一位。
由于是单链表,所以通过定义head2来保留链表的头部。
否则,while循环遍历后将无法访问链表的元素。

几道使用到链表的Leetcode题解

  • 两数之和 (简单)
    给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
class Solution(object):def addTwoNumbers(self, l1, l2):num1 = 0num2 = 0times = 0while l1 != None or l2 != None:if l1 != None:num1 += 10**times*l1.vall1 = l1.nextif l2 != None:num2 += 10 ** times * l2.vall2 = l2.nexttimes += 1num3 = num1 + num2temp = ListNode(0)head = tempfor i in reversed(str(num3)):temp.next = ListNode(int(i))temp = temp.nextreturn head.next
  • 删除链表的倒数第N个结点 (中等)
    给你一个链表,删除链表的倒数第n个结点,并且返回链表的头结点。
class Solution(object):def removeNthFromEnd(self, head, n):length = 0t = headx = headwhile head:length += 1head = head.nextcurrent = 1while t:if current == length - n and n != 1 and n != length:t.next = t.next.nextelif n == 1 and current == length - 1 :t.next = Nonereturn xelif n == length:return t.nextt = t.nextcurrent += 1return x
  • 合并两个有序链表 (简单)
    将两个升序链表合并为一个新的升序链表并返回。 新链表是通过拼接给定的两个链表的所有节点组成的。
class Solution(object):def mergeTwoLists(self, list1, list2):if not list1:return list2if not list2:return list1result = Nonewhile list1 or list2:if not (list1 and list2):while list1:result = ListNode(list1.val,result)list1 = list1.nextwhile list2:result = ListNode(list2.val,result)list2 = list2.nextelse:if list1.val < list2.val:result = ListNode(list1.val,result)list1 = list1.nextelse:result = ListNode(list2.val, result)list2 = list2.nextresult2 = Nonewhile result:result2 = ListNode(result.val,result2)result = result.nextreturn result2
  • 两两交换链表中的节点 (中等)
    给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。 你必须在不修改节点内部的值的情况下完成本题 (即,只能进行节点交换)。
class Solution(object):def swapPairs(self, head):if not head:return headif not head.next:return headcopyhead = head.nextwhile head and head.next:second = head.nextif head.next.next:third = head.next.nextif head.next.next.next:head.next = head.next.next.nextelse:head.next = head.next.nextelse:head.next = Nonethird = Nonesecond.next = headhead = thirdreturn copyhead
  • 删除排序链表中的重复元素(简单)
    给定一个已排序的链表的头head,删除所有重复的元素,使每个元素只出现一次。返回已排序的链表 。
class Solution(object):def deleteDuplicates(self, head):node = headif not head:return headwhile head.next:if not head.next == None:if head.val == head.next.val:head.next = head.next.nextelse:head = head.nextreturn node

题目来源:力扣
查看原题:力扣题库

 


http://chatgpt.dhexx.cn/article/G0LrxgXU.shtml

相关文章

循环链表的创建

循环链表的创建以及基本操作 上篇我们讲了运用头插法和尾插法创建单链表的方法&#xff0c;和两种方法的比较。 接着我们学习循环链表的创建。 只要学会了单链表的创建&#xff0c;循环链表的创建就变得很简单。 循环链表创建 单链表的结构&#xff1a; 循环链表&#xff1a…

单链表的创建

单链表类型定义 单链表是由一串结点组成的&#xff0c;其中每个结点都包含指向下一个结点的指针&#xff0c;最后一个结点的指针为空&#xff1b; 假设结点只包括一个整数和指向下一结点的指针 typedef struct node{int data;struct node *next; }LNode,*LinkList; //LNode为…

创建双向链表(详解)

双向链表操作 在学习了单链表之后&#xff0c;就顺带学习了双链表的操作。 什么是双链表&#xff1f; 双链表顾名思义&#xff0c;就是链表由单向的链变成了双向链。 使用这种数据结构&#xff0c;我们可以不再拘束于单链表的单向创建于遍历等操作&#xff0c;大大减少了在使…

如何构建一个简单链表

如何构建一个简单链表 一、 含构造函数和默认实参的结构体 typedef struct node {int data;struct node* next;node(int data 0, struct node* next NULL): data(data), next(next) {}} node; 二、 创建一个一定长度的链表 (一) 错误样例&#xff1a; int n 3;node* head …

C++:创建链表的过程详解

创建链表的过程详解 本人是一名刚开始学习算法的小白&#xff0c;今天遇到了一些关于链表的创建问题&#xff0c;查了一些资料&#xff0c;我把它们整理了一下&#xff0c;希望大家多多指教。 整体的代码&#xff1a; #include<iostream> using namespace std;struct …

链表的创建与使用

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 目录 文章目录 前言 一、链表是什么&#xff1f; 二、链表的创建与基本操作 1.链表的创建 3.链表的头插 4.链表的尾插 5.链表的销毁 6.链表的查找 7.链表的删除…

链表的创建

目录 一&#xff1a;链表的定义 二&#xff1a;链表的改进 链表的实现可以为后面JAVA的类集框架服务。 链表是一种最简单的数据结构&#xff0c;其主要目的是依靠引用关系实现多个数据的保存。 一&#xff1a;链表的定义 定义一个Node类&#xff0c;保存的数据是String型&a…

C语言之创建链表

自己琢磨着思考了一下书上的单链表的创建案例&#xff0c;记录一下自己的理解 代码如下&#xff1a; #include<stdio.h> #include<stdlib.h>struct Student{char cName[20];int age;struct Student* pNext; }; /*节点数量*/ int iCount0;/*创建链表的函数 返回头…

如何创建链表?

链表&#xff1a; 链表的组成其实很简单&#xff0c;就是由很多结点组成的。 一个结点包含数据域和指针域&#xff0c;数据域用来存放数据&#xff0c;指针域负责指向其他结点&#xff0c;起到链接的作用。创建链表&#xff1a; 其实创建一个链表也很简单&#xff0c;在我看来…

用CodeBlocks写SFML程序

vs2019 写sfml程序简直杀鸡用牛刀&#xff0c;vs2019占用资源太大了。 所以我想到了用Dev-C&#xff0c;然而我不会配置&#xff0c;卑鄙的CSDN相关资料查阅需要VIP&#xff0c;然而VIP太贵了。 SFML官方教程是用Code::Blocks&#xff0c;于是去下一个。 setup安装........ …

[笔记]使用SFML来生成分形图片

前言 最近在上《优秀科普纪录片》时&#xff0c;看了一部有关 分形 的纪录片&#xff0c;在观看的过程中&#xff0c;想着自己也来生成一些分形图片&#xff0c;正好偶然了解到了SFML这个简单的图形库&#xff0c;所以天时地利人和&#xff0c;正好查一些资料来学习一下。 以…

SFML环境配置

材料&#xff1a; 1.visual studio 2017 2.SFML-2.5.1-windows-vc15-32-bit 准备阶段 1.进入SFML官网下载sfml-vs2017-32bit版本 2.将该压缩包解压在一个文件夹中 步骤&#xff1a; 1.进入vs&#xff0c;在上述文件夹中新建Empty Project&#xff0c;右键资源文件->添加-…

[SFML] 多个OpenGL上下文

代码 #include <iostream> #include <gl/glew.h> #include <SFML/Graphics.hpp> #include <windows.h>int main() {auto getInstance [](){return (HINSTANCE)GetModuleHandle(nullptr);};auto debug [](GLenum source, GLenum type, GLuint id, GL…

SFML配置问题

先去下载安装包&#xff0c;这里我就不多说了&#xff0c;我想说的是其中的报错问题&#xff0c;按照我所说的对照下去&#xff0c;一般不会出现报错现象。 ** 第一步&#xff1a; **找到项目属性&#xff0c;这里我选择所有配置和所有平台&#xff0c;你们也可以选择其他的。…

SFML+vs2019安装

SFMLvs2019安装 1.创建一个c空项目 2.打开属性管理器 3.添加新项目属性表 在64下单击鼠标右键 添加成功后回到属性表64找到刚刚添加的属性表单击鼠标右键–>属性单击 找到SFML安装目录的include&#xff0c;复制路径粘贴到C/C->常规–>附加包含目录 找到SFM…

SFML初学-俄罗斯方块实现

偶然看到大神使用 SFML 制作游戏&#xff0c;简单学习了一下这个库的使用并且仿照YouTube上大神的思路做了一个俄罗斯方块&#xff0c;目前只实现了出现方块、消除方块的功能&#xff0c;随着慢慢学习一点点继续修改吧&#xff1b; 资源&#xff1a; 源码&#xff1a; /*******…

使用c++SFML制作月圆之夜总集篇

写在开头 重新以时间线的形式整理一下去年使用c的SFML库制作月圆之夜&#xff08;游戏程序设计大作业&#xff09;的开发过程&#xff0c;括号里面是新的补充以及对一年前自己的吐槽 因为是在大二转专业后做首次接触游戏开发后才做的&#xff0c;当时c学习得并不好&#xff0…

SFML loadFromFile()出错:failed to load image

解决方法&#xff1a;确保你的依赖项和你的运行库一致。 如果你的附加依赖项&#xff08;即动态链接库的.lib文件&#xff09;是debug版本&#xff0c;即以-d结尾。那么你的运行库也必须为debug版&#xff0c;即MDd。&#xff08;如下&#xff09; 附加依赖项的位置&#xff1…

用c++和SFML实现简易的界面版贪吃蛇

运行截图 等待开始界面 运行过程 失败界面截图 SFML配置 csdn上面已经有很多SFML配置的blog&#xff0c;随便就能搜到。正常配置好SFML后&#xff0c;还需要将字体ttf文件放在源代码同一目录和exe同一目录中&#xff0c;不然无法显示字符 代码部分 下面贴上各个部分的代码 …

VS2017、VS2019配置SFML

一、sfml官网下载32位的版本 一样的设置&#xff0c;64位的版本我没有成功&#xff0c;用不了。 https://www.sfml-dev.org/ bin目录下的文件拷贝到System32和SysWOW64里面。 二、 鼠标右击红色处&#xff0c;弹出菜单&#xff0c;点最后那个属性。 如果不是win32&#xff0c;…