题目描述:给一个链表和非负整数k,将其在下标k处翻转。如:
Given 1->2->3->4->5->NULL and k = 2,
return 4->5->1->2->3->NULL.
分析:没有指定k的范围,则k有可能大于链表长度。故翻转前应将 k %= len。利用循环链表的思想,将尾结点的next指针指向首结点,再从len - k处断开。时间复杂度O(n),空间O(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 (head == nullptr || k == 0)
return head;
int len = 1;
ListNode* p = head;
while(p->next) //走到链表尾结点,顺便统计链表长度
{
len++;
p = p->next;
}
k = len - k%len; //得到原链表头部应该保留的结点个数
p->next = head;
for ( int i = 0; i < k; i ++) //重新遍历到断裂位置
p = p->next;
head = p->next;
p->next = nullptr;
return head;
}
};