📜  反转给定链表的前 K 个元素(1)

📅  最后修改于: 2023-12-03 15:22:54.672000             🧑  作者: Mango

反转链表前K个元素

本文介绍如何反转给定链表的前K个元素。具体地,我们将给出一个算法,其时间复杂度为O(n),空间复杂度为O(1)。

思路

我们可以通过三个指针来实现反转操作。具体地,我们需要维护一个指向前一个结点的指针和一个指向当前结点的指针,以及一个指向当前结点之后的结点的指针。我们不断将当前结点指向前一个结点,然后将三个指针都向右移动一位即可。

需要注意的是,当到达第K个元素时,我们需要将其指向后面的元素。同时,当反转结束后,前K个元素的最后一个元素应该指向反转的部分之后的第一个元素。

代码
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

class Solution:
    def reverse(self, head: ListNode, k: int) -> ListNode:
        if not head:
            return None
        pre, cur = None, head
        for i in range(k):
            nxt = cur.next
            cur.next = pre
            pre = cur
            cur = nxt
        head.next = self.reverse(cur, k) # 连接第一部分和第二部分
        return pre
测试

我们可以用一个小例子来测试我们的代码。

l1 = ListNode(1, ListNode(2, ListNode(3, ListNode(4, ListNode(5)))))
s = Solution()
ans = s.reverse(l1, 3)
while ans:
    print(ans.val, end=" ")
    ans = ans.next

输出结果应该为:

3 2 1 4 5

这表明我们的算法可以正确地反转给定链表的前3个元素。