当前位置: 首页 > news >正文

数据结构与算法1: 链表

基础知识

链表可以被想象为一系列的节点,每个节点至少有一个指针指向下一个节点,在最后一个节点,用null pointer来表示链表的结束。

链表的创建速度通常很快,在表头和表尾的插入也很快(O(1)),但是销毁和搜索查找则很慢(O(n))。

解题技巧

PreNode的使用

题目: . - 力扣(LeetCode)

介绍: 在链表中,经常会通过在链表前面插入一个节点的形式,来让之后的讨论变得简单。比如下面的这道题, 由于对于节点进行两两交换,将会造成head节点的更换,如果利用prenode,可以避免复杂的分类讨论。

# 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: Optional[ListNode]) -> Optional[ListNode]:cur_node = ListNode()cur_node.next = headpre_node = cur_nodewhile(cur_node  and cur_node.next and cur_node.next.next):next_node = cur_node.nextnext2node = next_node.nextcur_node.next = next2nodetmp_node = next2node.nextnext2node.next = next_nodenext_node.next = tmp_nodecur_node = next_nodereturn pre_node.next

快慢指针,链表反转

题目名称: 重排链表

链接: ​​​​​​. - 力扣(LeetCode)

介绍:本题的目标是将链表进行重新组合,如下图。

如果按照标准的解法,我们需要实现三步

1. 链表中点的获取

2. 链表的反转

3. 链表的插入

而每一步都是比较经典的链表操作。

首先,为了获取链表中点,我们可以通过快慢链表。

def getMidNode(head: ListNode)->ListNode:fast_node = headslow_node = headwhile(fast_node.next.next and slow_node.next):fast_node = fast_node.next.nextslow_node = slow_node.nextreturn slow_node

然后,我们需要进行链表的反转。

def reverseList(head: ListNode)->ListNode:prev_node = Nonecur_node = headwhile(cur_node):next_node = cur_node.nextcur_node.next = prev_nodeprev_node = cur_nodecur_node = next_nodereturn prev_node

其中需要注意的是,我们要存储prev_node, next_node; 在while循环中,我们每次需要判断cur_node, 但是更重要的是,在最后一次,cur_node必然为空,因此,最后需要返回的是prev_node.

最后,我们需要实现列表的融合。

对应的就是 A--> B  和 C--> D, 变为 A-->C --> B --> D . 为了实现这一操作, 我们每次需要对于两个链表的next node进行备份,然后再更改current node的相互关系,然后再去处理next node。

def mergeLists(headA:ListNode, headB:ListNode):curA = headAcurB = headBwhile(curA and curB):tmpA = curA.nexttmpB = curB.nextcurA.next = curBcurB.next = tmpAcurA = tmpAcurB = tmpBreturn headA

实现了这些子模块后,我们经过整合,就可以实现最后的功能。为了把两个链表进行拆分,我们需要将中间节点的next在备份之后,设定为0。

midNode = getMidNode(head)headA = headheadB = midNode.nextmidNode.next = NoneheadB = reverseList(headB)result = mergeLists(headA, headB)return result

参考链接:

https://www.cs.princeton.edu/courses/archive/spr11/cos217/lectures/08DsAlg.pdf

数据结构学习①--链表_ptr.next = l1 || l2; ptr = ptr.next;-CSDN博客


http://www.mrgr.cn/news/24021.html

相关文章:

  • Linux内核 -- 内存管理之 lru_cache_add_inactive_or_unevictable 函数
  • [Linux]:文件(下)
  • MySQL-CRUD入门2
  • 网络初识-相关概念
  • 《深度学习》OpenCV 高阶 图像直方图、掩码图像 参数解析及案例实现
  • 神经处理单元(NPU)小知识
  • 通信电路和信道的区别与联系
  • 004——双向链表和循环链表
  • 如何利用 CSS 渐变实现多样化背景效果
  • python+pytest+request 接口自动化测试
  • 量化交易backtrader实践(一)_数据获取篇(2)_tushare与akshare
  • 统计上升四元组
  • Mysql基础练习题 1527.患某种疾病的患者 (力扣)
  • NVDLA专题14:Runtime environment-用户模式驱动
  • 【网易低代码】第3课,页面表格删除功能
  • debug对于开发工程师很重要
  • 基于Springboot的鲜花销售网站的设计与实现
  • 解决 git 不是内部或外部命令,也不是可运行的程序
  • Vue双向数据绑定代码解读
  • 秃姐学AI系列之:实战Kaggle比赛:图像分类(CIFAR-10)