给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数
解法1: 把链表连成一个环,把倒数第k个位置置为头节点即可。需要注意旋转长度为链表长度时,链表未发生改变。即当旋转大于链表长度时需要k%length操作。
执行用时 : 2 ms,98.79% 。内存消耗 : 35.1 MB,91.37% 。
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public ListNode rotateRight(ListNode head, int k) { if(head==null) return head; ListNode p = head; ListNode q = head; int count =0; int temp =0; //求出链表长度 while(q!=null){ q=q.next; count++; } //如果旋转为链表长度的话,还是这个链表本身。 if(count==k) return head; //重新将q置为头节点。 q=head; if(k>count) k=k%count; //循环结束,q在尾节点,p在倒数第k或者倒数第k%count那个节点的前边一个节点 while(q.next!=null){ temp++; if(temp<=k){ q=q.next; }else{ q=q.next; p=p.next; } } //将尾指向头节点,同时将p的下个节点设置为头节点,p作为尾节点。 q.next=head; head=p.next; p.next=null; return head; } }