题目描述
给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。
解题思路
注意这不是“翻转链表”。额,自己刚开始的思路是类似189题“旋转数组”那样,同样旋转链表两次,看了题解后发现这种思路太蠢啦。简单思路:
- 先将链表闭合成环。(同时计算链表长度)
- 找到相应的位置断开这个环,确定新的链表头和链表尾。(找倒数第
k+1
个节点)
参考代码
/**
* 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(k == 0 || head == nullptr)
return head;
int length = 1;
ListNode* pNode = head;
while(pNode->next != nullptr){
pNode = pNode->next;
length++;
}
k = k % length; // 此时的k一定比length小
if(k == 0)
return head;
pNode->next = head;
ListNode* pNewTail = head;
for(int i = 1; i <= length-k-1; i++)
pNewTail = pNewTail->next;
ListNode* pNewHead = pNewTail->next;
pNewTail->next = nullptr;
return pNewHead;
}
};
PS:用快慢指针的方式会更简单,这里懒得写了。(原理类似于找链表倒数第K个节点)