如何使用Python实现链表的旋转k个位置操作

2023-04-11 00:00:00 链表 如何使用 旋转

链表的旋转k个位置操作是指将链表中的元素向右移动k个位置,注意是向右移动。下面是使用Python实现链表的旋转k个位置操作的具体步骤:

1.首先判断链表是否为空或者只有一个元素,一旦是,直接返回原链表。

2.计算出链表的长度,同时将k取模,因为对于长度为n的链表,旋转k个位置和旋转k%n个位置是等价的,而且k%n < n。

3.将链表拆分成两个部分:前n-k个节点为第一部分,后k个节点为第二部分。第二部分的最后一个节点应该指向空。

4.将第一部分的最后一个节点指向空,并将第二部分的头节点作为新的头节点。

5.最后返回新的头节点即可。

下面是Python代码演示:

# 定义链表节点
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

# 定义链表旋转k个位置的函数
def rotateRight(head: ListNode, k: int) -> ListNode:
    if not head or not head.next or k == 0:  # 链表为空或者只有一个节点或者k=0
        return head

    # 计算链表长度和将k取模
    n, cur = 1, head
    while cur.next:
        n += 1
        cur = cur.next
    k %= n

    if k == 0:  # k%n=0,链表无需旋转
        return head

    # 将链表拆分成两个部分并进行旋转
    cur.next = head  # 连接成环形链表
    for _ in range(n-k):
        cur = cur.next
    new_head = cur.next  # 新的头节点
    cur.next = None  # 新的尾节点

    return new_head  # 返回新的头节点

# 测试
# 输入: 1->2->3->4->5->None,k = 2
# 输出: 4->5->1->2->3->None
head = ListNode(1)
head.next = ListNode(2)
head.next.next = ListNode(3)
head.next.next.next = ListNode(4)
head.next.next.next.next = ListNode(5)
k = 2
new_head = rotateRight(head, k)
cur = new_head
while cur:
    print(cur.val, end=' ')
    cur = cur.next
# 输出: 4 5 1 2 3 

上面的代码中,我们使用了一个计数器n和一个指针cur来计算出链表的长度n,并且找到最后一个节点cur。接下来,我们将k对n取模,找到旋转的实际位置,并将链表拆分成前n-k个节点和后k个节点两个部分。最后,我们使用一个循环将第二部分的头节点作为新的头节点,并将第一部分的最后一个节点指向空。最后返回新的头节点即可。

总之,通过上述实现,我们实现了链表的旋转k个位置,是一个非常实用的操作。

相关文章