python 链表基本操作
链表创建
class ListNode:def __init__(self, val, next=None):self.val = valself.next = next
链表反转
迭代法
class Solution:def reverseList(self, head: ListNode) -> ListNode:cur = head pre = Nonewhile(cur!=None):temp = cur.next # 保存一下 cur的下一个节点,因为接下来要改变cur->nextcur.next = pre #反转#更新pre、cur指针pre = curcur = tempreturn pre
递归法
class Solution:def reverseList(self, head: ListNode) -> ListNode:def reverse(pre,cur):if not cur:return pretmp = cur.nextcur.next = prereturn reverse(cur,tmp)return reverse(None,head)
链表相邻两个交换
迭代
class Solution:def swapPairs(self, head: ListNode) -> ListNode:res = ListNode(next=head)pre = res# 必须有pre的下一个和下下个才能交换,否则说明已经交换结束了while pre.next and pre.next.next:cur = pre.nextpost = pre.next.next# pre,cur,post对应最左,中间的,最右边的节点cur.next = post.nextpost.next = curpre.next = post#pre可以理解为temp 临时头结点 pre后面两个节点交换pre = pre.next.nextreturn res.next
递归
class Solution(object):def swapPairs(self, head):# 递归的终止条件if not (head and head.next):return head# 假设链表是 1->2->3->4# 这句就先保存节点2tmp = head.next# 继续递归,处理节点3->4# 当递归结束返回后,就变成了4->3# 于是head节点就指向了4,变成1->4->3head.next = self.swapPairs(tmp.next)# 将2节点指向1tmp.next = headreturn tmp
删除链表倒数第N个结点
计算链表长度
class Solution:def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:def getLength(head: ListNode) -> int:length = 0while head:length += 1head = head.nextreturn lengthdummy = ListNode(0, head)length = getLength(head)cur = dummyfor i in range(1, length - n + 1):cur = cur.nextcur.next = cur.next.nextreturn dummy.next
栈(先进后出)
class Solution:def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:dummy = ListNode(0, head)stack = list()cur = dummywhile cur:stack.append(cur)cur = cur.nextfor i in range(n):stack.pop()prev = stack[-1]prev.next = prev.next.nextreturn dummy.next
双指针(快慢指针)
class Solution:def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:head_dummy = ListNode()head_dummy.next = headslow, fast = head_dummy, head_dummywhile(n!=0): #fast先往前走n步fast = fast.nextn -= 1while(fast.next!=None):slow = slow.nextfast = fast.next#fast 走到结尾后,slow的下一个节点为倒数第N个节点slow.next = slow.next.next #删除return head_dummy.next
链表相交
找两个链表的相交结点
双指针
class Solution:def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:"""根据快慢法则,走的快的一定会追上走得慢的。在这道题里,有的链表短,他走完了就去走另一条链表,我们可以理解为走的快的指针。那么,只要其中一个链表走完了,就去走另一条链表的路。如果有交点,他们最终一定会在同一个位置相遇"""if headA is None or headB is None: return Nonecur_a, cur_b = headA, headB # 用两个指针代替a和bwhile cur_a != cur_b:cur_a = cur_a.next if cur_a else headB # 如果a走完了,那么就切换到b走cur_b = cur_b.next if cur_b else headA # 同理,b走完了就切换到areturn cur_a
环形链表
找环形链表中环的入口:
快慢指针(快指针一次走两个结点,慢指针一次走一个结点)
再使用两个指针,一个从起点出发,一个从快慢指针相遇点出发,这两个指针相遇点即环的入口(Z=(n-1)*(x+y) + y)
class Solution:def detectCycle(self, head: ListNode) -> ListNode:slow, fast = head, headwhile fast and fast.next:slow = slow.nextfast = fast.next.next# 如果相遇if slow == fast:p = headq = slowwhile p!=q:p = p.nextq = q.next#你也可以return qreturn preturn None
python 链表基本操作相关推荐
- 【Python】python链表
python链表总结 原Blog链接:https://blog.csdn.net/qq_44941689/article/details/122402938 1. 链表基本类型 链表(Linked L ...
- python链表操作_Python链表操作(实现)
Python链表操作 在Python开发的面试中,我们经常会遇到关于链表操作的问题.链表作为一个非常经典的无序列表结构,也是一个开发工程师必须掌握的数据结构之一.在本文中,我将针对链表本身的数据结构特 ...
- Python字符串基本操作
Python字符串基本操作 1.判断是不是合法的标识符isidentifier name="ABC" print(name.isidentifier()) 打印结果 True 2. ...
- Python文件基本操作
Python文件基本操作 1.文件对象的属性 属性 描述 file.closed 如果文件已被关闭返回true,否则返回false. file.mode 返回被打开文件的访问模式. file.name ...
- 数据结构 【实验3 链表基本操作】
实验3 链表基本操作 实验目的 1. 定义单链表的结点类型. 2. 熟悉对单链表的一些基本操作和具体的函数定义. 3. 通过单链表的定义掌握线性表的链式存储结构的特点. 4. 掌握循环链表和 ...
- python scrapy 基本操作演示代码
python scrapy 基本操作演示代码 # -*- coding: utf-8 -*- import scrapy # from quotetutorial.items import Quote ...
- Python的基本操作
一.Python的基本操作 1.1 Python基本语法 Python中严格区分大小写 Python中每一行就是一条语句,每条语句以换行结束 Python中每一行语句不要过长(建议每行不超过80个字符 ...
- 搬砖:数据结构之链表基本操作总结
数据结构之链表基本操作总结 2017年05月11日 18:22:11 Lily_whl 阅读数:19151 https://blog.csdn.net/Lily_whl/article/details ...
- 7-4 单链表基本操作
7-4 单链表基本操作 请编写程序实现单链表插入.删除结点等基本算法.给定一个单链表和一系列插入.删除结点的操作序列,输出实施上述操作后的链表.单链表数据域值为整数. 输入格式: 输入第1行为1个正整 ...
最新文章
- Silverlight 3.0 Beta版 正式发布
- qtcreator cannot find -lts
- Learning ROS: Service and Client (C++)
- 前端学习(3210):react中类中方法的this指向二
- mysql用户权限表join_MyBatis映射利用mysql left join 解决N+1查询问题
- 作者:周涛,博士,北京启明星辰信息安全技术有限公司教授级高工。
- tensorflow.keras搭建gan神经网络,可直接运行
- IDEA中集成使用SVN
- linux查看cpu核数命令,Linux系統下如何查看CPU型號、核心數量、頻率和溫度?
- 阿里巴巴矢量字体转Image图片(建议收藏)
- 7篇ICLR论文,遍览联邦学习最新研究进展
- python Numpy中求向量和矩阵的范数
- apache kafka技术分享系列(目录索引)
- 功能性测试用例设计方法深入理解
- android usb otg 查看,android USB OTG功能如何打开及实现
- mysql按笔划排序_mysql中怎么按姓氏笔画排序
- 毛玻璃效果就是这么唯美
- EXCEL数据分析:统计函数
- Java中的输入scanner
- php log4j,log4j 使用笔记
热门文章
- plsql远程oracle 乱码,oracle11g_64位连接32位PLSQL中文乱码
- 计算机配置中无可移动设备访问,由于您的计算机尚未建立以太网,wifi或移动数据连接,因此我们无法设置移动热点-...
- 眼肌弹性恢复练习——近视的朋友进来看!
- 新手创建第一个微信小程序教程
- Android payload注入
- Windows PowerShell管理员模式下切换目录
- cmd 用管理员模式 python安装import包
- arm 32 常见汇编指令解释
- 大数据量树形数据表格展示, umy-ui,
- Avue的upload数组图片上传以及删除后上传又出现的问题