将给定的链表向右转动k个位置,k是非负数。
例如:
给定1->2->3->4->5->null , k=2,
返回4->5->1->2->3->null。
import java.util.*; /* * public class ListNode { * int val; * ListNode next = null; * } */ public class Solution { /** * * @param head ListNode类 * @param k int整型 * @return ListNode类 */ public ListNode rotateRight (ListNode head, int k) { // write code here if(head==null || k==0) return head; //双指针 ListNode slow = head; ListNode fast = head; while(k>0){ if(fast == null) fast=head; fast =fast.next; k--; } if(fast == null) return head; while(fast.next!=null){ slow=slow.next; fast=fast.next; } ListNode temp =slow.next; slow.next=null; fast.next=head; return temp; } }
import java.util.*; /* * public class ListNode { * int val; * ListNode next = null; * } */ public class Solution { /** * 思路:将一个链表从待旋转节点分开,如 1 -> 2 -> 3 -> 4 ->5 旋转2次的结果 4 ->5 -> 1 -> 2 -> 3 * 可以看做 4->5 + 1 -> 2 -> 3,即从3的位置分开 * @param head * @param k * @return */ public ListNode rotateRight(ListNode head, int k) { // 不旋转 if (head == null || k == 0) { return head; } // 获取链表长度 ListNode cur = head; int len = 0; while (cur != null) { cur = cur.next; len++; } k = k % len; // 不旋转 if (k == 0) { return head; } // pre为待旋转节点的前一个节点 ListNode dummy = new ListNode(0); dummy.next = head; ListNode pre = dummy; int now = 0; while (pre != null) { pre = pre.next; now++; if (now == len - k) { break; } } ListNode tempNode = pre.next; pre.next = null; // 开始旋转 ListNode secondDummy = new ListNode(0); secondDummy.next = tempNode; while (tempNode.next != null) { tempNode = tempNode.next; } tempNode.next = dummy.next; return secondDummy.next; } }
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */ public class Solution { public ListNode rotateRight(ListNode head, int n) { if(head == null || head.next == null || n == 0) return head; int len = 0; ListNode temp = head; //遍历到链表尾部,得到链表长度 while(temp != null){ temp = temp.next; len ++; } if(n == len) return head; if(n > len){ n = n % len; } int index = len - n; ListNode pre = null; ListNode cur = head; while(cur != null && index > 0){ pre = cur; cur = cur.next; index --; } pre.next = null; //中间断链 ListNode newhead = cur; while(cur.next != null){ cur = cur.next; } cur.next = head; //原链表尾部指向原链表头部 return newhead; } }
public class Solution { public ListNode rotateRight(ListNode head, int n) { if(head == null || head.next == null || n <= 0){ return head; } ListNode start = head, end = head; for(int i = 0; i< n; i++){ end = end.next; if(end == null){ end = head; } } if(end == head){ return head; } while(end.next != null){ start = start.next; end = end.next; } ListNode tmp = start.next; start.next = null; end.next = head; return tmp; } }
public class Solution {
public ListNode rotateRight(ListNode head, int n) {
if (head == null)
return head;
ListNode slow = head;
ListNode fast = head;
for (int i = 0; i < n; i++) {
fast = fast.next;
if (fast == null)
fast = head;
}
while (fast.next != null) {
fast = fast.next;
slow = slow.next;
}
fast.next = head;
ListNode newH = slow.next;
slow.next = null;
return newH;
}
}
public class Solution { public ListNode rotateRight(ListNode head, int n) { if(head==null||head.next==null)return head; for(int i =1;i<=n;i++){ ListNode p = head; ListNode p1=head; ListNode p2 = null; while(p1.next!=null){ if(p1.next.next==null){ p2 =p1; } p1=p1.next; } p2.next=null; p1.next=p; head=p1; } return head; } }
//首先要看k的值是否大于链表长度,如果大于链表长度,则取余确定右边第几个节点为head //将最后一个节点的next指向原来的head,这样成为了一个环, //之后遍历到新head的前一个节点将前一个节点的next赋值为null,最后返回新head public class Solution { public ListNode rotateRight(ListNode head, int n) { if(head == null || n < 0){ return head; } int length = 1; ListNode node = head; //获得链表长度 while(node.next!=null){ ++length; node = node.next; } //获得右边第i个下标 int k = n % length; //将最后一个节点指向head,形成一个环 node.next = head; //接下来的遍历节点数 int num = length - k; for(int i=0;i<num;i++){ node = node.next; } //得到新节点 head = node.next; node.next = null; return head; } }
public class Solution { public ListNode rotateRight(ListNode head, int n) { ListNode p = head,end = null; int num = 0; if(p==null)return p; while(p!=null){ num++; end = p; p = p.next; } if(n%num == 0)return head; int i = 1; p = head; while(i < num-n%num){ p = p.next; i++; } ListNode q = p.next; end.next = head; p.next = null; return q; } }
public class Solution { public ListNode rotateRight(ListNode head, int n) { if(head == null || n == 0) return head; int num = 1; ListNode cur = head; while(cur.next != null) { num++; cur = cur.next; } n %= num; if(n == 0) return head; cur.next = head; for(int i=0; i<num-n; i++) { cur = cur.next; } head = cur.next; cur.next = null; return head; } }
public static ListNode rotateRight(ListNode head, int n) { if (head == null) //空 return null; ListNode fast, slow; //快慢指针 fast = slow = head; int lenOfList = getLen(head); //获取链表长度 int k = n % lenOfList; //取余 if (k == 0) //不变 return head; for (int i = 0; i < k; i++) { fast = fast.next; } //slow指向前半段的最后一个,fast指向后半段最后一个 while (fast.next != null){ fast = fast.next; slow = slow.next; } ListNode newHead = slow.next; slow.next = null; //变成最后一个 fast.next = head; //连上head return newHead; } //获取链表长度 private static int getLen(ListNode head) { ListNode p = head; int len = 0; while (p != null){ len++; p = p.next; } return len; }
Since n may be a large number compared to the length of list. So we need to know the length of linked list.After that, move the list after the (l-n%l )th node to the front to finish the rotation.
Ex: {1,2,3} k=2 Move the list after the 1st node to the front
Ex: {1,2,3} k=5, In this case Move the list after (3-5%3=1)st node to the front.
So the code has three parts.
Get the length
Move to the (l-n%l)th node
3)Do the rotation
public ListNode rotateRight(ListNode head, int n) { if (head==null||head.next==null) return head; ListNode dummy=new ListNode(0); dummy.next=head; ListNode fast=dummy,slow=dummy; int i; for (i=0;fast.next!=null;i++)//Get the total length fast=fast.next; for (int j=i-n%i;j>0;j--) //Get the i-n%i th node slow=slow.next; fast.next=dummy.next; //Do the rotation dummy.next=slow.next; slow.next=null; return dummy.next; }