Given a list, rotate the list to the right by k places, where k is non-negative.
For example:
Given 1->2->3->4->5->NULL and k = 2,
return 4->5->1->2->3->NULL.
问题描述:给定一个链表,将这个链表向右旋转k个位置,k是非负数。
看上面的例子,如果能够找到倒数第k + 1个节点和最后一个节点就可以了,假设p指向该节点,q指向尾节点,那么进行如下操作即可将链表旋转。
q->next = head; head = p->next; p->next = NULL;那么问题就变成了如何找到倒数第k + 1个节点和最后一个节点呢?从后面开始计数,可以使用栈来进行辅助计数。
首先将所有节点指针都入栈,入栈完毕之后,栈顶元素就是尾节点的指针,然后依次出栈,出k + 1次,最后一次出栈得到的节点就是倒数第k + 1个节点。
class Solution {
public:
ListNode *rotateRight(ListNode *head, int k) {
stack
sta;
ListNode *pnode = head, *rear = NULL;
int len = 0;
if(head == NULL || k == 0)
return head;
while(pnode) {
sta.push(pnode);
pnode = pnode->next;
++len;
}
k %= len;
++k;
if(!sta.empty())
rear = sta.top();
while(k--) {
pnode = sta.top();
sta.pop();
}
rear->next = head;
head = pnode->next;
pnode->next = NULL;
return head;
}
};