61. 旋转链表
给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。
示例 1:
输入:head = [1,2,3,4,5], k = 2

输出:[4,5,1,2,3]
示例 2:
输入:head = [0,1,2], k = 4
输出:[2,0,1]
思路:
假定链表如图。

我们可以发现,将链表每个节点向右移动一步就是将当前链表的末尾节点设为头结点。末尾节点的上一个节点设置为末尾节点,再断开它和末尾节点的关系。

题目要求移动k次,我们只要将移动 k%上数组的长度 次。 可以省去无效移动。
代码示例:
typedef struct ListNode Node;
struct ListNode* rotateRight(struct ListNode* head, int k){
if(head == NULL) return NULL;
//先求出链表长度
Node* tmp = head;
int len = 0;
while(tmp)
{
tmp = tmp->next;
len++;
}
//只有一个节点直接返回
if(len == 1) return head;
k %= len;
while(k--)
{
Node* tail = head; //数组末节点
Node* prev = NULL;//末节点前一节点
while(tail->next)
{
prev = tail;
tail = tail->next;
}
tail->next = head; //连接头节点
prev->next = NULL; //断开与新头节点连接
head = tail; //设置新头节点
}
return head;
}
本文解析了如何通过迭代方式,利用临时变量和链表长度计算,高效地实现链表节点向右旋转k次的操作。理解并掌握这个技巧有助于在面试和实际编程中解决链表相关问题。
522

被折叠的 条评论
为什么被折叠?



