[LeetCode] Rotate List

2014-11-24 07:11:00 · 作者: · 浏览: 0

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;
    }
};