[LeetCode] Rotate List

来源:互联网 发布:电脑电视台直播软件 编辑:程序博客网 时间:2024/06/07 19:21

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


0 0
原创粉丝点击