@Author:Runsen

@Date:2020/9/13

链表是我这辈子的痛啊,每次学到链表,就往往不会,就没有继续学下去。现在大四不能继续让这个链表阻碍我了。现在基本是重刷数据结构和算法,毕竟笔试真的太重要了。 我又重温了争大佬专栏的栈,又巩固了下。

争哥专栏有一个非常的经典:就是关于指针的理解:将某个变量赋值给指针,实际上就是将这个变量的地址赋值给指针,或者反过来说,指针中存储了这个变量的内存地址,指向了这个变量,通过指针就能找到这个变量。

涉及到链表的操作,重新看了专栏,一定要在纸上把过程先画出来,再写程序。对于链表其实基本就是单链表,很少是双链表,或者循环链表的题目

由于一个节点只通过next指针保存了它的下一个节点,失去了它的前驱节点信息,而且单链表数据结构通常长度未知,因此几乎所有单链表题目都是在前驱节点和长度上做文章。
常见链表面试算法,可以使用双指针迭代的方式以及递归的方式。

下面就是我2020/9/13 在leetcode 刷的链表题目,很多注释都写清楚了。关于题目的描述,这里不直接抄Leetcode 了。

文章目录

  • LeetCode206 反转一个单链表
  • Leetcode 第二题 addTwoNumbers
  • 剑指 Offer 18. 删除链表的节点
  • 面试题 02.03删除中间节点
  • 面试题 02.01. 移除重复节点
  • 面试题 02.06 回文链表
  • Leetcode 143. 重排链表
  • 剑指 Offer 22. 链表中倒数第k个节点
  • Leetcode19. 删除链表的倒数第N个节点

LeetCode206 反转一个单链表

这个反转单链表,写了N次,但又写的时候,又写不出来。服了,自己。看似,简单,博客最起码写了3次 反转一个单链表

class Solution:def reverseList(self, head: ListNode) -> ListNode:prev = Nonecur = headwhile cur:# prev 指cur.next cur指prev cur.next指curcur.next,prev,cur = prev,cur,cur.nextreturn prev

Leetcode 第二题 addTwoNumbers

class Solution:def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:# 将l1链表的数取出,组成一个数,l2同理,最终求和,将求和结果循环得出每个节点的值,然后链表连接即可!!!# 将链表转化列表val1, val2 = [l1.val], [l2.val]print(val1) #[2]print(val2) #[5]while l1.next:val1.append(l1.next.val)l1 = l1.nextwhile l2.next:val2.append(l2.next.val)l2 = l2.nextprint(val1) #[2, 4, 3]print(val2) #[5, 6, 4]# 反转列表 用join方法拼接数字 切片[::-1]num_1 = ''.join([str(i) for i in val1[::-1]])num_2 = ''.join([str(i) for i in val2[::-1]])sums =  str(int(num_1) + int(num_2))[::-1]  # 708# 将sum转化成链表res# 头节点res  = head = ListNode(int(sums[0]))for i in range(1, len(sums)):# 拼接head.next = ListNode(int(sums[i]))head = head.nextreturn res

剑指 Offer 18. 删除链表的节点

class Solution:def deleteNode(self, head: ListNode, val: int) -> ListNode:# 如果头结点为空,直接返回if not head:return head# 如果头结点值等于val,直接返回head.next(题设中有注明链表中元素不重复)if  head.val == val:return head.next# 定义一个指针cur = headwhile cur.next:# 关键步骤,如果next的值等于val,跳过该节点if cur.next.val == val:cur.next = cur.next.nextbreakcur = cur.nextreturn head

面试题 02.03删除中间节点

# 将要删除节点的 val 赋值为下一结点的 val
node.val = node.next.val
# 然后将要删除节点的下一结点指向要删除节点的下一结点的下一结点
node.next = node.next.next

面试题 02.01. 移除重复节点

class Solution:def removeDuplicateNodes(self, head: ListNode) -> ListNode:# 如果没有head,那么直接returnif not head: return # 用集合来储存起来visited = {head.val}cur = head# 处理当前节点的下一个节点while cur and cur.next:# 如果当前的val在字典中,那么直接不要 if cur.next.val in visited:cur.next = cur.next.nextelse:# 集合的add 直接加入 集合或者元组都可以visited.add(cur.next.val)# 往下遍历cur = cur.nextreturn head

面试题 02.06 回文链表

class Solution:def isPalindrome(self, head: ListNode) -> bool:# 链表转化为列表,判断是不是  回文res = []cur = headwhile cur:res.append(cur.val)cur = cur.next# print(res)if res[::-1] == res:return Trueelse:return False

Leetcode 143. 重排链表

class Solution:'''@Author :Runsen给定链表 1->2->3->4, 重新排列为 1->4->2->3.给定链表 1->2->3->4->5, 重新排列为 1->5->2->4->3.就是每次取两边,先左到右 1 -> 2 -> 3 -> 4 -> 5 -> 6第一步,将链表平均分成两半1 -> 2 -> 34 -> 5 -> 6第二步,将第二个链表逆序1 -> 2 -> 36 -> 5 -> 4第三步,依次连接两个链表1 -> 6 -> 2 -> 5 -> 3 -> 41 -> 2 -> 3 -> 4 -> 5 -> 6'''# 思路 找到中间节点,然后将右面的翻转,先定义一个翻转函数,Leetcode 206题def reverseList(self, head):pre = Nonecur = headwhile cur:cur.next, pre, cur = pre, cur, cur.nextreturn predef reorderList(self, head: ListNode) -> None:"""Do not return anything, modify head in-place instead."""if not head:return headslow, fast = head, headwhile fast and fast.next:slow, fast = slow.next, fast.next.next# 寻找中间节点 快慢指针中的慢指针就是中间节点p = slow.nextslow.next = Nonep = self.reverseList(p)# 这个时候的p就是链表右面的翻转m = headwhile p:# 怎么拼接?# m ,m.next, p, p.next  => p, m.next, m.next, p.next  返回的是m这个链表m.next, p.next, m, p = p, m.next, m.next, p.next

剑指 Offer 22. 链表中倒数第k个节点

最常规的方法就是将链表变成数组,直接一个索引取值就可以了。

class Solution:def getKthFromEnd(self, head: ListNode, k: int) -> ListNode:res = []while head:res.append(head)head = head.nextreturn res[-k]

有的大佬给出快慢指针的方法,就是快指针先走 K 步,然后再快慢指针一起走,当快指针跑出来时,慢指针的就是倒数第k个节点。

class Solution:def getKthFromEnd(self, head: ListNode, k: int) -> ListNode:former, latter = head, headfor _ in range(k):former = former.nextwhile former:former, latter = former.next, latter.nextreturn latter

参考:https://leetcode-cn.com/problems/lian-biao-zhong-dao-shu-di-kge-jie-dian-lcof/solution/mian-shi-ti-22-lian-biao-zhong-dao-shu-di-kge-j-11/

Leetcode19. 删除链表的倒数第N个节点

给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。

示例:

给定一个链表: 1->2->3->4->5, 和 n = 2.

当删除了倒数第二个节点后,链表变为 1->2->3->5.

这题和上面那题是一样的,都是快慢指针,只不过这里需要返回链表的头结点。那定义一个Node = ListNode(None)就可以了。

class Solution:def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:# 快慢指针Node = ListNode(None)Node.next = headfirst,slow = Node,Nodefor i in range(n):first = first.nextwhile first.next != None:first = first.nextslow = slow.nextslow.next = slow.next.nextreturn Node.next

不知不觉现在到了下午三点,从早上九点半到现在,刷了九题的链表算法题目,真心累!!!!

为了OFFER,花了几个小时,刷下Leetcode链表算法题相关推荐

  1. 打牌博弈 dfs深度优先遍历搜索 排课表 拓扑排序 升序字符串 动态规划 剑指offer编程题整理 leetcode每日算法题

    递归,回溯, 深度优先搜索 题目描述 有一叠扑克牌,每张牌介于1和10之间 有四种出牌方法: 单出1张 出2张对子 出五张顺子,如12345 出三连对子,如112233 给10个数,表示1-10每种牌 ...

  2. 蜡笔小新里的钢达姆机器人怎么画_写字机器人好用吗? 组装就花了5个小时 还要学习软件、录入字体...

    据江苏公共·新闻频道<新闻360>报道:新学期开学,各种各样的课后作业成了孩子和家长关注的话题.前不久,一条"孩子购买代写作业机器人,被家长发现"的新闻,引发了强烈争议 ...

  3. 我花了14个小时找了一下长春长生们究竟卖到了哪里去

    前言 本文转载自「同程安全应急响应中心」.全文的观点从技术讨论出发,尽量客观中立,观点及行为为员工自发,不代表本人所在公司及团队. 需要说明的是这次数据是涵盖所有的疫苗数据,并不是针对此次问题疫苗定向 ...

  4. 爱因斯坦台阶java_数学智力题之爱因斯坦的台阶,我花了1个小时才做出来,你呢?...

    数学是一门严谨的学科.在人们看来,数学总是枯燥乏味且晦涩难懂的.也正因为如此,不少小学生丧失了学习数学的兴趣.特别是刚刚开始上学的孩子们,如果只是单纯地培养他们的数学思维,势必会把他们学习数学的兴趣扼 ...

  5. 成功解决ValueError: array must not contain infs or NaNs(花了好几个小时解决了这个最离奇的bug)

    成功解决ValueError: array must not contain infs or NaNs(花了好几个小时解决了这个最离奇的bug) 目录 解决问题 解决思路 解决方法 问题背景

  6. 曾经花上数十小时编写过的QQ农场辅助精灵

    QQ农场辅助精灵DotNet(c#)版是2009年8月份自已编写的,开发工具是vs2005,语言c#,花了数十小时编写与调试,也算是检验编写辅助外挂类程序的能力. 编写基于http协议的辅助外挂类程序 ...

  7. 程序员花了14个小时找出了长春长生们究竟卖到了哪里去

    程序员花了14个小时找出了长春长生们究竟卖到了哪里去  01前言 全文的观点从技术讨论出发,尽量客观中立,观点及行为为员工自发,不代表本人所在公司及团队. 需要说明的是这次数据是涵盖所有的疫苗数据,并 ...

  8. 我又花了28个小时分析了一下各省二类疫苗采购公示数据

    1    前  言 距离<我花了14个小时找了一下长春长生们究竟卖到了哪里去>发出来已经过去了4天,过去的几天里,每天晚上我都在搜集和整理数据,终于把之前没做完的工作做的差不多了. 现在做 ...

  9. 递增的整数序列链表的插入_每日算法题 | 剑指offer 链表专题 (5)链表中倒数第k个节点...

    点击上方"Jerry的算法和NLP",选择"星标"公众号 重磅干货,第一时间送达 题目 链表中倒数第k个节点 题目要求 输入一个链表的头结点,从尾到头反过来打印 ...

最新文章

  1. boost::spirit模块实现复杂的日期解析器的测试程序
  2. python解zuobiaoxi方程_Python还能解决数学相关问题?大学生:以后就靠他了,事半功倍...
  3. python加入中小学课程_通知:中小学将新增一门课!对2008-2013年出生的孩子影响最大!...
  4. 优酷VIP被黑灰产恶意冒领出现BUG 用户疯抢一年VIP
  5. ie系列浏览器_IE浏览器换Logo,真担心你上网找不到图标
  6. 游戏服务器系统是什么意思,游戏服务器都是什么系统
  7. 详解display:inline | block |inline-block的区别(转)
  8. Google Chrome 所有版本下载
  9. 解决百度文库文档内容无法复制
  10. windows10搭建DVWA靶场(新手向)
  11. 采集器 mysql_搜索结果 : mysql - 火车采集器帮助中心
  12. 【广告计算】互联网控制舆论的三个方法
  13. cad菜单栏快捷键_CAD快捷键:表格填写命令FORMTXT如何使用?
  14. 集大1513 1514班 软件工程第二次作业评分与点评
  15. spring-day04_JdbcTemplate声明式事务
  16. PDF怎么转换成PPT且可以修改里面的文字
  17. 个人发展分析:SWOT
  18. 英国小黄车玩法,国际版抖音tiktok小店
  19. Testbench编写指南(2)文件的读写操作
  20. 解决用联通看不了B站等问题

热门文章

  1. OS / Linux / clone、fork、vfork 与 pthread_create 创建线程有何不同
  2. 小明分享|sigmstar SSD201/SSD202 针对RGB的LCD屏配置操作说明分享
  3. 全志 添加TP休眠触摸唤醒 Patch
  4. 0402封装ESD二极管选型
  5. 国开专科计算机应用基础,2021年国开专科《计算机应用基础》形考任务题库大全.docx...
  6. ibe加密原理_ibe 基于身份的IBE加密源代码,采用C++语言编写,能够运行。 Crypt_De algrithms 解密 238万源代码下载- www.pudn.com...
  7. CDN边缘JavaScript敏捷交付实践
  8. 启动oracle00119,oracle启动报ORA-00119错误
  9. vue These dependencies were not found: * core-js/modules/es.array.iterator in ./node_modules/@babe
  10. 剪切粘贴时总是上次的内容_如何关闭 iOS 14 的粘贴通知