链表创建

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 链表基本操作相关推荐

  1. 【Python】python链表

    python链表总结 原Blog链接:https://blog.csdn.net/qq_44941689/article/details/122402938 1. 链表基本类型 链表(Linked L ...

  2. python链表操作_Python链表操作(实现)

    Python链表操作 在Python开发的面试中,我们经常会遇到关于链表操作的问题.链表作为一个非常经典的无序列表结构,也是一个开发工程师必须掌握的数据结构之一.在本文中,我将针对链表本身的数据结构特 ...

  3. Python字符串基本操作

    Python字符串基本操作 1.判断是不是合法的标识符isidentifier name="ABC" print(name.isidentifier()) 打印结果 True 2. ...

  4. Python文件基本操作

    Python文件基本操作 1.文件对象的属性 属性 描述 file.closed 如果文件已被关闭返回true,否则返回false. file.mode 返回被打开文件的访问模式. file.name ...

  5. 数据结构 【实验3 链表基本操作】

    实验3  链表基本操作 实验目的 1.  定义单链表的结点类型. 2.  熟悉对单链表的一些基本操作和具体的函数定义. 3.  通过单链表的定义掌握线性表的链式存储结构的特点. 4.  掌握循环链表和 ...

  6. python scrapy 基本操作演示代码

    python scrapy 基本操作演示代码 # -*- coding: utf-8 -*- import scrapy # from quotetutorial.items import Quote ...

  7. Python的基本操作

    一.Python的基本操作 1.1 Python基本语法 Python中严格区分大小写 Python中每一行就是一条语句,每条语句以换行结束 Python中每一行语句不要过长(建议每行不超过80个字符 ...

  8. 搬砖:数据结构之链表基本操作总结

    数据结构之链表基本操作总结 2017年05月11日 18:22:11 Lily_whl 阅读数:19151 https://blog.csdn.net/Lily_whl/article/details ...

  9. 7-4 单链表基本操作

    7-4 单链表基本操作 请编写程序实现单链表插入.删除结点等基本算法.给定一个单链表和一系列插入.删除结点的操作序列,输出实施上述操作后的链表.单链表数据域值为整数. 输入格式: 输入第1行为1个正整 ...

最新文章

  1. Silverlight 3.0 Beta版 正式发布
  2. qtcreator cannot find -lts
  3. Learning ROS: Service and Client (C++)
  4. 前端学习(3210):react中类中方法的this指向二
  5. mysql用户权限表join_MyBatis映射利用mysql left join 解决N+1查询问题
  6. 作者:周涛,博士,北京启明星辰信息安全技术有限公司教授级高工。
  7. tensorflow.keras搭建gan神经网络,可直接运行
  8. IDEA中集成使用SVN
  9. linux查看cpu核数命令,Linux系統下如何查看CPU型號、核心數量、頻率和溫度?
  10. 阿里巴巴矢量字体转Image图片(建议收藏)
  11. 7篇ICLR论文,遍览联邦学习最新研究进展
  12. python Numpy中求向量和矩阵的范数
  13. apache kafka技术分享系列(目录索引)
  14. 功能性测试用例设计方法深入理解
  15. android usb otg 查看,android USB OTG功能如何打开及实现
  16. mysql按笔划排序_mysql中怎么按姓氏笔画排序
  17. 毛玻璃效果就是这么唯美
  18. EXCEL数据分析:统计函数
  19. Java中的输入scanner
  20. php log4j,log4j 使用笔记

热门文章

  1. plsql远程oracle 乱码,oracle11g_64位连接32位PLSQL中文乱码
  2. 计算机配置中无可移动设备访问,由于您的计算机尚未建立以太网,wifi或移动数据连接,因此我们无法设置移动热点-...
  3. 眼肌弹性恢复练习——近视的朋友进来看!
  4. 新手创建第一个微信小程序教程
  5. Android payload注入
  6. Windows PowerShell管理员模式下切换目录
  7. cmd 用管理员模式 python安装import包
  8. arm 32 常见汇编指令解释
  9. 大数据量树形数据表格展示, umy-ui,
  10. Avue的upload数组图片上传以及删除后上传又出现的问题