• 206. 反转链表及扩展


    206. 反转链表

    反转一个单链表。

    示例:

    输入: 1->2->3->4->5->NULL
    输出: 5->4->3->2->1->NULL

    递归

    # Definition for singly-linked list.
    # class ListNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.next = None
    
    class Solution:
        def reverseList(self, head: ListNode) -> ListNode:
            if not head or not head.next:return head
            ans=self.reverseList(head.next)
            head.next.next=head
            head.next=None
            return ans

    92. 反转链表 II

    反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。

    说明:
    1 ≤ m ≤ n ≤ 链表长度。

    示例:

    输入: 1->2->3->4->5->NULL, m = 2, n = 4
    输出: 1->4->3->2->5->NULL

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/reverse-linked-list-ii

    简单来说就是取出m~n的这一小段链表,反转后再插回去

    图片来自网络 

    class Solution:
        def reverseBetween(self, head: ListNode, m: int, n: int) -> ListNode:
            if not head.next or n == 1:
                return head
            dummy = ListNode()
            dummy.next = head
            pre = None
            cur = head
            i = 0
            p1 = p2 = p3 = p4 = None
            while cur:
                i += 1
                next = cur.next
                if m < i <= n:
                    cur.next = pre
                if i == m - 1:
                    p1 = cur
                if i == m:
                    p2 = cur
                if i == n:
                    p3 = cur
                if i == n + 1:
                    p4 = cur
                pre = cur
                cur = next
            if not p1:
                dummy.next = p3
            else:
                p1.next = p3
            p2.next = p4
            return dummy.next

    25. K 个一组翻转链表

    给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。

    k 是一个正整数,它的值小于或等于链表的长度。

    如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

    示例:

    给你这个链表:1->2->3->4->5

    当 k = 2 时,应当返回: 2->1->4->3->5

    当 k = 3 时,应当返回: 3->2->1->4->5

    说明:

    你的算法只能使用常数的额外空间。
    你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/reverse-nodes-in-k-group

    同理

    class Solution:
        def reverseKGroup(self, head: ListNode, k: int) -> ListNode:
            if head is None or k < 2:
                return head
            dummy = ListNode(0)
            dummy.next = head
            pre = dummy
            cur = head
            count = 0
            while cur:
                count += 1
                if count % k == 0:
                    pre = self.reverse(pre, cur.next)
                    cur = pre.next
                else:
                    cur = cur.next
            return dummy.next
    
        def reverse(self, p1, p4):
            prev, curr = p1, p1.next
            p2 = curr
    
            while curr != p4:
                next = curr.next
                curr.next = prev
                prev = curr
                curr = next
            # 将反转后的链表添加到原链表中
            # prev 相当于 p3
            p1.next = prev
            p2.next = p4
            # 返回反转前的头, 也就是反转后的尾
            return p2
  • 相关阅读:
    ABP源码编译及部署
    nopCommerce源码本地部署、配置及语言包导入
    MongoDB查询转对象时出错 Element '_id' does not match any field or property of class
    找不到资产文件 project.assets.json
    Docker中运行.net core 验证码不显示
    css设置input不显示光标
    js中的==和===
    Navicat连接mysql(高级选项配置)
    js回调函数,检测这个值是否重复
    layer数据表格换行
  • 原文地址:https://www.cnblogs.com/xxxsans/p/13381770.html
Copyright © 2020-2023  润新知