📅  最后修改于: 2023-12-03 15:11:17.005000             🧑  作者: Mango
旋转链表是指将链表的最后一个节点移动到链表的头部,其实现可以通过三次翻转来实现,而不需要真正地将最后一个节点移动到头部。
以下是一个用于旋转链表的 C++ 程序:
/**
* 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 == nullptr || k == 0) return head;
int len = 1;
ListNode* tail = head, *newHead;
while(tail->next) { // 求出链表长度和尾节点
tail = tail->next;
len++;
}
if(k % len == 0) return head; // 如果k是长度的整数倍,那么不用旋转
tail->next = head; // 首尾相连
k = len - k % len; // k也可以等价于k%len(这里换了一种求法)
for(int i = 0; i < k; i++) tail = tail->next; // 找到新的尾节点
newHead = tail->next; // 新的头节点是尾节点的后一个节点
tail->next = nullptr; // 断开连接
return newHead;
}
};
这里的代码基于链表,定义了一个名为ListNode
的结构体,表示链表的每个节点,包括节点的值和后继节点指针。rotateRight
函数的输入参数head
表示链表的头节点指针,k
表示要旋转的次数。函数的输出为旋转后的链表头节点指针。
实现过程可以分为以下几步:
len
和尾节点指针tail
。k
是len
的整数倍,则不需要旋转,直接返回原链表头指针。k%len
个节点。这种实现方式虽然具有一定的时间和空间复杂度,但是更为直观易懂,可以为初学者提供更好的理解。