C++程 链表的顺时针旋转

C++程 链表的顺时针旋转

问题描述

给定一个链表和一个整数k,将链表旋转k次。例如,给定链表 1->2->3->4->5->NULL和 k = 3,链表变为3->4->5->1->2->NULL。假设k是非负的。

实现思路

首先,我们需要先分析一下题目的意思。将一个链表顺时针旋转k次,相当于将链表的最后k个元素放到链表的最前面。

接下来,我们来考虑一下如何实现。

首先,我们需要找到链表倒数第k个节点。这可以通过使用快慢指针来实现。我们先使快指针向前移动k步,然后让慢指针从头开始移动,当快指针到达链表的末尾时,慢指针所指向的节点就是倒数第k个节点。

然后,我们需要将链表的最后k个节点放到链表的最前面。这可以通过将链表的最后一个节点与倒数第k+1个节点相连,然后将倒数第k个节点设为链表的头节点来实现。

最后,我们需要将倒数第k+1个节点设为链表的尾节点,也就是将它所指向的节点的next指针设置为NULL。

代码实现

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* rotateRight(ListNode* head, int k) {
        if (head == NULL || head->next == NULL || k == 0) {
            return head;
        }
        int length = 1;
        ListNode* tail = head;
        while (tail->next != NULL) {
            tail = tail->next;
            length++;
        }
        k %= length;
        if (k == 0) {
            return head;
        }
        ListNode* fast = head;
        ListNode* slow = head;
        for (int i = 0; i < k; i++) {
            fast = fast->next;
        }
        while (fast->next != NULL) {
            fast = fast->next;
            slow = slow->next;
        }
        ListNode* new_head = slow->next;
        slow->next = NULL;
        tail->next = head;
        return new_head;
    }
};

注:这里快慢指针指的是指针所指向链表的节点,而不是指针本身。

总结

在这篇文章中,我们讲解了如何将一个链表顺时针旋转k次。具体来说,我们使用了快慢指针来找到链表倒数第k个节点,并将链表的最后k个节点放到链表的最前面。这个问题其实是比较简单的,但是需要仔细思考才能得出正确的实现方法。希望这篇文章能够对你有所帮助。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程

C++ 示例