zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Dubbo服务者消费者提供者案例实现
    spring核心组件
    spring为什么要注入接口
    小菜鸡进阶之路_Second week之元组、列表、集合、字典对比.
    小菜鸡进阶之路-First week
    光学公式推到——(物象位置) 1/u+1/v=1/f
    C#问题——调用事件时其他信息: 未将对象引用设置到对象的实例。
    工业相机全局曝光和卷帘曝光的区别
    相机加接圈的作用和缺点
    C#——数组维度/行数/列数/长度区别
  • 原文地址:https://www.cnblogs.com/xxxsans/p/13381770.html
Copyright © 2011-2022 走看看