旋转链表
给定一个链表,旋转链表,将链表每个节点向右移动 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
解决思路:
计算链表的长度N,指向链表最后一个节点的指针end;
实际只需移动k%N个位置;
end.next=head,构成环形链表,同时移动head与end,移动N-k个位置即可。
public static ListNode rotateRight(ListNode head, int k) { if (k == 0 || head == null) return head; ListNode end = head; int N = 0; // 链表包含的节点数 while(end.next != null) { end = end.next; N++; } N ++; k = k % N; end.next = head; while(N-k>0) { head = head.next; end = end.next; k++; } end.next = null; return head; }
posted on 2018-05-14 19:33 Deltadeblog 阅读(141) 评论(0) 编辑 收藏 举报