链表做题总结(二)[86,92]

86.分割链表

在这里插入图片描述

思路:将链表先分后合,分为较大的和较小的,每遍历到一个节点,确定添到哪个列表后面,最后两个链表首位相接
注意:创建两个伪头节点;别忘了最终的尾节点的next指针设为空
代码:

class Solution:
    def partition(self, head: ListNode, x: int) -> ListNode:
        if (head==None or head.next==None):return head
        dummypre = ListNode(0)
        dummytail=ListNode(0)

        pre=dummypre
        tail=dummytail

        cur=head

        while cur:
            if cur.val < x:
                pre.next = cur
                pre = pre.next
            else:
                tail.next = cur
                tail=tail.next
      
            cur=cur.next

        tail.next = None
        pre.next = dummytail.next

        return dummypre.next

92. 反转链表 II

在这里插入图片描述

思路:第 1 步:从虚拟头节点走 left - 1 步,来到 left 节点的前一个节点
第 2 步:从 pre 再走 right - left + 1 步,来到 right 节点
第 3 步:切断出一个子链表(截取链表)
第 4 步:同第 206 题,反转链表的子区间
第 5 步:接回到原来的链表中
注意:头节点有可能发生变化,使用虚拟头节点可以避免复杂的分类讨
代码:

class Solution:
    def reverseBetween(self, head: ListNode, left: int, right: int) -> ListNode:
        def reverse(head):
            pre=None
            cur=head
            while cur:
                next=cur.next
                cur.next = pre
                pre = cur 
                cur=next
        dummyHead = ListNode(-1)
        dummyHead.next = head
        pre = dummyHead
        
        for _ in range(left - 1):
            pre = pre.next

        rightNode=pre
        for _ in range(right - left + 1):
            rightNode = rightNode.next


        leftNode = pre.next
        curr=rightNode.next


        pre.next = None
        rightNode.next = None
        leftNode.next = reverse(leftNode)

        pre.next=rightNode
        leftNode.next=curr
        return dummyHead.next
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值