文章目录

  • 引言
  • 1.删除链表中的节点
    • 203. 移除链表元素
    • 237. 删除链表中的节点
  • 2.分隔链表
    • 86. 分隔链表
  • 3.交换链表
    • 24. 两两交换链表中的节点
  • 4.旋转链表
    • 61. 旋转链表
    • 143. 重排链表

引言

  链表基本操作类题目分为以下几种

  1. 删除链表中的节点
  2. 分隔链表
  3. 交换链表
  4. 旋转链表
  5. 链表排序—这一部分内容在排序部分汇总

1.删除链表中的节点

203. 移除链表元素

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。

示例:

输入:head = [1,2,6,3,4,5,6], val = 6
输出:[1,2,3,4,5]

思路1:一个指针

如果只用一个指针遍历链表,我们会发现,当我们遍历到一个节点cur.val == val时,其实就无法删除这个节点了。所以如果想要删除某个节点,就必须找到这个节点的前一个节点cur.next.val == val,把前一个节点的指针改变,即指向下下一个。这样即可完成原地移除链表元素。

class ListNode:def __init__(self, val=0, next=None):self.val = valself.next = nextclass Solution:def removeElements(self, head: ListNode, val: int) -> ListNode:# 初始化一个虚拟头结点dummy_head = ListNode(0)# 虚拟头结点指向头结点dummy_head.next = headcur = dummy_headwhile cur.next != None:# 如果值相等,则将下一个节点跳过if cur.next.val == val:cur.next = cur.next.nextelse:# 值不等,则移动指针cur = cur.next# 循环结束时,cur指向最后一个节点return dummy_head.next

思路2:二个指针

cur指针用于判断当前元素与val的关系,pre指针指向这个节点的前一个节点。
思路1与思路2本质上是一样的

# Definition for singly-linked list.
class ListNode:def __init__(self, val=0, next=None):self.val = valself.next = nextclass Solution:def removeElements(self, head: ListNode, val: int) -> ListNode:dummy = ListNode(0)dummy.next = headpre,curr = dummy,headwhile curr:if curr.val == val:pre.next = curr.nextelse:pre = currcurr = curr.nextreturn dummy.next

237. 删除链表中的节点

请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点。传入函数的唯一参数为 要被删除的节点 。

示例:

输入:head = [4,5,1,9], node = 5
输出:[4,1,9]
解释:给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.

思路:

我们之前的思路是得到要删除节点的上一个节点,然后将要删除节点的上一个节点指向要删除节点的下一个节点。但是在本题内,我们没有遍历链表,我们只得到了要被删除的节点,它的上一个节点是无法获取的。那么我们就要找一个可以得知上一个节点的节点,将它变成要删除的节点。原理如下面三张图


class ListNode:def __init__(self, x):self.val = xself.next = Noneclass Solution:def deleteNode(self, node):""":type node: ListNode:rtype: void Do not return anything, modify node in-place instead."""# 改为下一节点的值node.val = node.next.val# 改为下一节点的next指针node.next = node.next.next

这道题目代码简单,但思路巧妙

由于这道题目只输入了需要删除的节点node,因此无法获取删除节点node的前一个节点pre,从而也就无法将前一个节点pre指向删除节点的下一个节点next;既然无法通过修改指针完成,那么肯定要修改链表节点的值了,所以只要将删除节点node的值和指针都改为下一个节点next的值和指针即可。

2.分隔链表

86. 分隔链表

给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在大于或等于 x 的节点之前。
你应当 保留 两个分区中每个节点的初始相对位置。

示例:

输入:head = [1,4,3,2,5,2], x = 3
输出:[1,2,2,4,3,5]

思路:

创建两个链表,一个链表保存小于x的数,另一个链表保存大于等于x的数,最后将两个链表进行拼接

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = nextclass Solution:def partition(self, head: ListNode, x: int) -> ListNode:cur = head# 创建两个链表l1 = ListNode(0)l2 = ListNode(0)head1 = l1head2 = l2while cur:if cur.val < x:l1.next = ListNode(cur.val)l1 = l1.nextelse:l2.next = ListNode(cur.val)l2 = l2.nextcur = cur.next# 将两个链表进行拼接l1.next = head2.nextreturn head1.next

3.交换链表

24. 两两交换链表中的节点

给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
说明:
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换

示例:

输入:head = [1,2,3,4]
输出:[2,1,4,3]

思路:

首先建立一个dummy为头节点,它的next 指向head。为了保证节点不丢失,我一共设置了pre、a、b三个指针,然后更新指针,完成交换。这里迭代的终止条件是 pre.next为空或 pre.next.next节点为空(说明后面的节点不到两个,无需交换)

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:def swapPairs(self, head: ListNode) -> ListNode:# 创建头节点dummy = ListNode(0)dummy.next = head# 三个指针pre、a、bpre = dummya = dummyb = dummy# 因为是两两交换,当后面元素个数小于等于1时,循环结束while pre.next != None and pre.next.next != None:a = pre.nextb = pre.next.next# 两两交换pre.next = ba.next = b.nextb.next = apre = pre.next.nextreturn dummy.next

4.旋转链表

61. 旋转链表

给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置

示例:

输入:head = [1,2,3,4,5], k = 2
输出:[4,5,1,2,3]

思路:

首先找到旧的尾部并将其与链表头相连(cur.next = head),整个链表闭合成环,同时计算出链表的长度n。然后找到新的尾部,第n -k %n -1个节点,新的链表头是第n -k %n个节点。最后断开环end.next = None,并返回新的链表头new_head。

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:def rotateRight(self, head: ListNode, k: int) -> ListNode:# 处理特殊情况if head == None:return Noneif head.next == None:return head# 循环链表,找到表尾,构造循环链表n = 1   # 统计链表中元素个数cur = headwhile cur.next != None:cur = cur.nextn += 1# 将链表尾指针指向头指针cur.next = head# 找到新的链表尾指针new = headfor _ in range(n-k%n-1):new = new.next# 找到新的链表头部节点,并将链表尾指针断开new_head = new.nextnew.next =Nonereturn new_head

143. 重排链表

给定一个单链表 L:L0→L1→…→Ln-1→Ln ,
将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→…
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

示例:

给定链表 1->2->3->4, 重新排列为 1->4->2->3.

思路:

先将链表拆分成前后两半A和B。后一半B逆转成C。再将A和C交叉合并。
例如:1->2->3->4->5拆分成:A=1->2->3,B=4->5。然后把B逆转成C=5->4。最后A和C交叉合并成D=1->5->2->4->3。
具体来说:

  1. 第一遍扫描找到中点
  2. 第二遍扫描,将后半段的指针都反向
  3. 第三遍扫描,将后半段交替插入前半段
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:def reorderList(self, head: ListNode) -> None:"""Do not return anything, modify head in-place instead."""if head == None or head.next == None or head.next.next == None:return head# 第一遍扫描找到中点# 利用快慢指针,快指针是慢指针速度的2倍,当快指针停下时,慢指针正好指向中点fast = headslow = headwhile fast != None and fast.next != None and fast.next.next != None:fast = fast.next.nextslow = slow.nextmid = slow# 第二遍扫描,将后半段进行翻转a = mid.nextb = mid.next.nextmid.next = Nonea.next = Nonewhile b !=None:t = b.nextb.next = aa = bb = t# 循环结束时,a指针指向头节点# 第三遍扫描,将翻转的后半段交替插入前半段b = headwhile a != None:t = a.nexta.next = b.nextb.next = ab = b.next.nexta = treturn head

如果对您有帮助,麻烦点赞关注,这真的对我很重要!!!如果需要互关,请评论或者私信!


leetcode—13.链表基本操作类题目python解答相关推荐

  1. 2017年第八届蓝桥杯省赛题目python解答(更新中)

    目录 1. 迷宫 2. 跳蚱蜢 3. 魔方状态 4. 方格分割 5. 正则表达式 6. 包子凑数 ·· 1. 迷宫 思路:使用暴力的方法来求解,对于每一个玩家,计算他能否走出去.对于一些走不出去的玩家 ...

  2. LeetCode 13. Roman to Integer

    问题链接 LeetCode 13. Roman to Integer 题目解析 将罗马数字转换成普通数字. 解题思路 先简单了解一下什么是罗马数字. 基本字符:I,V,X,L,C,D,M 相应的阿拉伯 ...

  3. Leetcode 13.罗马数字转整数

    Leetcode 13.罗马数字转整数 题目描述 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 100 ...

  4. 20200908:链表类题目集合上

    链表类题目集合上 题目 思路与算法 代码实现 写在最后 题目 1.力扣160. 相交链表 2.141. 环形链表 3.142. 环形链表 II 4. 86. 分隔链表 思路与算法 160相交链表:两种 ...

  5. 2021年 第13届 全国大学生数学竞赛 初赛(非数学类)试题详细解答

    [2020年第12届全国大学生数学竞赛--资源分享 ][1~11届省赛决赛考题及题解(数学类.非数学类).推荐学习网址.复习备考书籍推荐] 2019年 第11届 全国大学生数学竞赛 初赛(非数学类)试 ...

  6. 20210308 20210309 :链表类题目合集

    链表类题目回顾 写在前面 题目 思路与算法 代码实现 写在前面 这一类的题目上一次编写是在刚好6个月之前,也就是我20200908和20200909的两篇博客涉及了今天这一篇的所有题目,均为链表相关. ...

  7. 20200909:链表类题目集合下

    链表类题目集合下 题目 思路与算法 代码实现 写在最后 题目 1.138. 复制带随机指针的链表 2.21. 合并两个有序链表 3.23. 合并K个升序链表 思路与算法 返回深拷贝这个题目的意思读清楚 ...

  8. Python LeetCode(13.罗马数字转整数)

    Python LeetCode(13.罗马数字转整数) 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M ...

  9. LeetCode 刷题之路(python版)

    摘自:https://blog.csdn.net/qq_32384313/article/details/90745354 LeetCode 刷题之路(python版) 小坏wz 2019-06-02 ...

  10. 2022年嵌入式秋招题目及解答

    2022年嵌入式秋招题目及解答 1 ARM体系结构.总线.各种外设.微机原理 ARM的中断处理流程,以及每个阶段做什么事(中断触发到返回的具体行为): 中断上下文 中断嵌套如何实现(NVIC相关) 两 ...

最新文章

  1. 使用C# 3.0编译器编译 Asp.Net 项目代码
  2. .net framework开发winform_这个Winform的UI库也太全了!四十多个控件都在这一个项目里了...
  3. 【译】On Path Independence
  4. 【Linux】一步一步学Linux——nstat命令(190)
  5. spring java配置_Spring基于java的配置
  6. shell远程执行命令
  7. int true python_python基本数据类型,int, str, bool及相关操作
  8. 最新创意购物促销海报设计,广告人必看!
  9. coreldraw中制作蚊香实例_关于CorelDRAW印前排版规范你知道么?
  10. ActiveMQ学习总结(1)——ActiveMQ快速入门
  11. python顺序查找的递归算法_Python实现查找算法
  12. 最小化——最速下降法matlab实现
  13. c语言贪吃蛇设计意义,C语言贪吃蛇设计理念.pdf
  14. 学习Python的几个优质平台
  15. html5ie11缩放,IE 11 页面缩放后再次打开不能保存之前的缩放比例
  16. leetcode237
  17. css3加号图标_css实现“加号”效果的实例代码
  18. 你还不知道钉钉服务端API全局错误码吗?
  19. 人工智能的快速发展,对我们的不利影响有哪些?
  20. 赵小楼《天道》《遥远的救世主》深度解析(37)丁元英参加酒局前的小插曲:从冯世杰的刁难找茬说说“心是愿望,神是境界”

热门文章

  1. 动态分页《查看更多》
  2. 什么是FLV视频格式?FLV视频格式是什么意思?
  3. SQL中CONVERT函数全部用法对日期操作
  4. 如何进行ASP.NET MVC 的测试
  5. 30天敏捷结果(24):恢复你的精力
  6. 深度学习网络架构(三):VGG
  7. linux下查看分区信息和剩余空间大小
  8. 使用phonegap,进行页面跳转
  9. (转)主成分分析(Principal components analysis)-最大方差解释
  10. 跟bWAPP学WEB安全(PHP代码)--SSL(Server-Side-Include)漏洞