
给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。
示例 1:
输入: 1->2->3->4->5->NULL, k = 2
输出: 4->5->1->2->3->NULL
解释:
向右旋转 1 步: 5->1->2->3->4->NULL
向右旋转 2 步: 4->5->1->2->3->NULL
示例 2:
输入: 0->1->2->NULL, k = 4
输出: 2->0->1->NULL
解释:
向右旋转 1 步: 2->0->1->NULL
向右旋转 2 步: 1->2->0->NULL
向右旋转 3 步: 0->1->2->NULL
向右旋转 4 步: 2->0->1->NULL
算法描述
要求将链表中的每一个节点向右移k个位置,可以优化为,先找到链表尾的位置,将尾部和头部连起来成为一个环,将移动的k位对链表长度取模,找到最后链表的头部,把环断开,返回新的链表就可以了;
C++代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
class { public: ListNode* rotateRight(ListNode* head, int k) { if(head==NULL)return head; if(head->next==NULL)return head; int len=1; ListNode *l=NULL; l=head; while(l->next){ len++; l=l->next; } k=k%len; l->next=head; l=head; for(int i=0;i<len-k-1;i++) l=l->next; head=l->next; l->next=NULL; return head; } };
|
Java代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
class { public ListNode rotateRight(ListNode head, int k) { if(head==null||head.next==null)return head; int len = 1; ListNode l = head; while(l.next!=null){ len++; l=l.next; } k=k%len; l.next=head; l=head; for(int i=0;i<len-k-1;i++)l=l.next; head = l.next; l.next = null; return head; } }
|
近期评论