首页 > 编程语言 >代码随想训练营第四天(Python)| 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、02.07. 链表相交、142.环形链表II

代码随想训练营第四天(Python)| 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、02.07. 链表相交、142.环形链表II

时间:2023-10-17 21:03:55浏览次数:36  
标签:24 head slow cur fast next 链表 节点

两两交换链表中的节点
关键点:涉及到头节点变动的都使用虚拟节点。画图找出交换节点指向的顺序和退出循环的条件。
1、迭代法

class Solution:
    def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:
        dummy_node = ListNode(next=head)
        cur = dummy_node       # 这里需要操作 2 个节点的位置,所以cur 指向2个节点前的位置好操作
        while cur.next != None and cur.next.next != None: # 画图写出跳出循环的条件
            first = cur.next            # 临时变量记录下第一个节点
            next_first = cur.next.next.next # 临时变量记录下第二轮的第一个节点
            cur.next = cur.next.next        # cur 指向交换位置的节点 second
            cur.next.next = first      # 交换了 second 和 first 的位置
            first.next = next_first     # 连接上后面的节点
            cur = first                 # 移动指针 cur 的位置 或者 cur = cur.next.next
        return dummy_node.next

2、递归法

class Solution:
    def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:
        if head is None or head.next is None:
            return head
        first = head                # 第一轮的第一个节点
        second = head.next          # 第一轮的第二个节点
        next_first = head.next.next  # 第二轮的第一个节点

        second.next = first         # 交换第一和第二个节点
        first.next = self.swapPairs(next_first)  # 连接后续交换顺序的接点
        return second

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

class Solution:
    def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
        if head is None:
            return head
        dummy_node = ListNode(next=head)
        slow = fast = dummy_node
        while n+1 and fast != None:   # 这里 n+1 是让快节点比慢节点多走一步,因为是需要删除 n 处的节点
            fast = fast.next
            n -= 1
        while fast:
            slow = slow.next
            fast = fast.next
        slow.next = slow.next.next
        return dummy_node.next

02.07. 链表相交
等比例法,双指针分别走完 headA 和 headB 后,要么相聚在相交节点,要么是空节点

class Solution:
    def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
        if headA is None or headB is None:
            return
        p1 = headA
        p2 = headB
        while p1 != p2:
            p1 = p1.next if p1 else headB # 走完 headA 后走 headB, 都走完了为 None 或者是相交节点
            p2 = p2.next if p2 else headA
        return p1

142.环形链表II
快慢指针 fast = 2slow。
x(启始节点到环入口的距离)
y(环入口到相遇点的距离)
z(相遇点到环入口的距离)
slow = x + y
fast = x + (y+z)
n (n>=1)
2(x+y) = x + y + (y+z)n
x = (n-1)*(y+z) + z

    def detectCycle(self, head: Optional[ListNode]) -> Optional[ListNode]:
        slow = fast = head
        while fast and fast.next:
            fast = fast.next.next
            slow = slow.next
            if fast == slow:  # 快慢指针相遇
                new_slow = slow
                new_fast = head
                while new_slow != new_fast:
                    new_fast = new_fast.next
                    new_slow = new_slow.next
                return new_slow
        return

标签:24,head,slow,cur,fast,next,链表,节点
From: https://www.cnblogs.com/yixff/p/17768741.html

相关文章

  • 比赛总结:Japan Registry Services (JPRS) Programming Contest 2023 (AtCoder Beginn
    比赛:JapanRegistryServices(JPRS)ProgrammingContest2023(AtCoderBeginnerContest324)A-same1.常规方法intmain(){ intn; cin>>n; vector<int>s(n);//利用vector容器可以不需要确定内存大小 for(auto&n:s) { cin>>n; } for(inti=0;i......
  • Day3 链表的一些基本练习
    Day3链表的基础练习最基本的删除节点Lc203我习惯的还是弄一个新的dummyhead,然后如果是要找的节点,就删除,删除完记得delete。//代码没什么好看的,主要就是熟悉链表的写法classSolution{public:ListNode*removeElements(ListNode*head,intval){ListNode......
  • Leetcode206. 反转链表
    题目描述给你单链表的头节点head,请你反转链表,并返回反转后的链表。示例提交的代码classSolution{publicListNoderesultHead;publicListNodereverseList(ListNodehead){if(head==null)returnnull;ListNodefirst=recursionOfList(he......
  • java链表详解 理论+代码+图示
    1、定义链表是一种物理存储结构上非连续存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的。(即链表是一个个节点组成的,这些节点物理上不连续,但逻辑上连续)一个节点就是一个Node对象。2、链表结构单向、双向;带头、不带头;循环、非循环; 以上情况组......
  • Intel发布入门级至强E-2400:13代酷睿师弟、砍掉小核
    Intel刚刚推出了首批14代酷睿处理器,但是13代又有了新的衍生版,面向入门级服务器和工作站的至强E-2400系列。至强E系列的节奏一直很慢,基本两年一代:2019年的E-2200系列源自8/9代酷睿,2021年的E-2300系列来自11代酷睿。最新的至强E-2400系列还没有正式发布,官方产品库里也找不到,但是......
  • 24 组件传递数据
    组件之间相互传递数据,props只能是,父级组件parent传递数据给子级组件child静态传递动态传递:在静态的基础上,v-bind:{{}}data()返回值,这些结合使用即可<template><!--文本绑定才需要{{}},属性绑定不需要--><Childtitle="静态传递数据":demo="msg"/></te......
  • JIRA 在 2024 年完全停止服务器版本支持
    在服务器上的开源许可证版本已经要过期了,想去更新下。发现,JIRA的所有服务器版本的支持马上就要结束了。  这就意味着,如果你部署的服务器版本的JIRA的话,你将没有办法对服务器进行更新。  貌似,必须使用JIRA提供的云服务版本,这对有数据安全需求,并且希望在本地服务器上部署的......
  • JIRA 在 2024 年完全停止服务器版本支持
    在服务器上的开源许可证版本已经要过期了,想去更新下。发现,JIRA的所有服务器版本的支持马上就要结束了。  这就意味着,如果你部署的服务器版本的JIRA的话,你将没有办法对服务器进行更新。  貌似,必须使用JIRA提供的云服务版本,这对有数据安全需求,并且希望在本地服务......
  • 叮!你有一份1024程序员节的通关秘籍待查收!
    突破性的变革往往源自一瞬间面对大模型的挑战你,或许也能成为下一个关键人物值此1024程序员节之际文心大模型携手飞桨以“超级码力碰撞未来”为主题,发起4大活动准备了一场专属于开发者们的惊喜盛会带你通关,碰撞未来!一起度过一个快乐而又充实的程序员节!AIShow·碰撞出创意10......
  • 倾斜摄影三维模型的根节点合并的重要性分析
    倾斜摄影三维模型的根节点合并的重要性分析 倾斜摄影三维模型的根节点合并是整个模型构建过程中的一个重要环节,具有重要的意义和作用。本文将对倾斜摄影三维模型的根节点合并的重要性进行详细分析。一、定义和概述在倾斜摄影三维模型的构建过程中,根节点合并是指将不同块或区......