今天的题目很简单,只需要考虑分为两部分,拆分链表即可
主要的思路是:考虑k值和链表长度的余数,针对余数的值来找到拆分为两个链表的位置,再串成一个链表。【不知道思路会不会太复杂,直接的想法就是这样。】
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode rotateRight(ListNode head, int k) {
if(head==null) return null;
// 计算链表的长度n
ListNode p = head;
int n = 0;
while(p!=null){
n++;
p = p.next;
}
// k%n的值来计算后面几个取出来放在前面,k=0不变,原链表输出
// 可以用双指针来找到最后需要动的部分的定位
int move = k%n;
if(move==0){
return head;
}else{
// 保存前半段链表
ListNode headNew = head;
ListNode pre = head;
ListNode cur = head;
int m = 0;
while(m!=move){
cur = cur.next;
m++;
}
while(cur.next!=null){
pre = pre.next;
cur = cur.next;
}
// 此时pre指向前半段的最后一个,cur指向后半段的最后一个
head = pre.next;
cur.next=headNew;
pre.next = null;
}
return head;
}
}