LeetCode:旋转链表【61】
题目描述
给定一个链表,旋转链表,将链表每个节点向右移动 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次。
向右旋转一个单位怎么处理呢?
找到最后两个节点,让最后一个节点的next指向第一个节点,然后倒数第二个节点的next指向空。
处理一个问题,对于循环次数我们可以用求余数来提高效率,比如长度为5,那么循环10000次也还是原来的就不需要循环。
Java题解
package linklist; import java.util.Scanner; public class RotateList_61 { public static void main(String[] args) { ListNode node1 = new ListNode(1); ListNode node2 = new ListNode(2); ListNode node3 = new ListNode(3); ListNode node4 = new ListNode(4); ListNode node5 = new ListNode(5); node1.next=node2; node2.next=node3; node3.next=node4; node4.next=null; new RotateList_61().rotateRight(node1,2); } public ListNode rotateRight(ListNode head, int k) { if(head==null) return null; int len = getLen(head); for(int i = 0;i<k%len;i++) { head = rotateRight(head); } return head; } public ListNode rotateRight(ListNode head) { ListNode ptrL = head; ListNode ptrR = ptrL.next; if(ptrR==null) return head; while (ptrR.next!=null) { ptrL=ptrL.next; ptrR=ptrR.next; } ptrR.next=head; ptrL.next=null; return ptrR; } public static int getLen(ListNode node) { int count = 0; while (node!=null) { count++; node=node.next; } return count; } }