leetcode
题目描述给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。
1.将链表头尾相连形成一个环
2.计算链表总长度sum,并找到尾结点
3.根据链表总长度计算要旋转移动的长度sum-k%sum;
4.找到新的头结点,并将其与上一个节点断开
tip:链表是顺时针,head是逆时针旋转,所以旋转移动的长度为sum-k (k<0);又因为如果k>n,例如k=5,sum=3,即转了1圈再转2个,环形链表相当于移动了两个,所以k=k%sum,综上要旋转移动的长度为sum-k%sum。
/**
* 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 || k==0){
return head;
}
ListNode cur = head;
int sum = 1;
while(cur.next != null){
sum++;
cur = cur.next;
}
cur.next = head;
for(int i=0;i<sum-k%sum;i++){
cur = cur.next;
}
ListNode res = cur.next;
cur.next = null;
return res;
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)