题目:给你一个链表的头节点 head
,旋转链表,将链表每个节点向右移动 k
个位置。
和之前的数组转换一样,先求出k mod n,只关注余数因为不管循环了多少次都是相同的链表。
首先求出链表长度,先定一一个节点,因为这个节点会移到最后,所以正好用他来连接头节点形成环。
为什么要形成环?因为新链表的最后一个节点是原链表的第 (n-1) - (k%n)个节点。
要明白,连成环之后,从最后一个节点移动s步就对应着k = n-s 。
即在最后一个节点移动s步之后切断链表。
(当然也可以使用和数组反转一样的思路:1、全反转。2、前k反转。3、后n-k反转)
可以想成为:把后k个节点截下来连到链表头
public class no_61 {
public static void main(String[] args) {
ListNode l = new ListNode(1, new ListNode(2, new ListNode(3,
new ListNode(4, new ListNode(5)))));
ListNode re = rotateRight(l, 2);
while (re != null) {
System.out.println(re.val);
re = re.next;
}
}
public static ListNode rotateRight(ListNode head, int k) {
if (k == 0 || head == null || head.next == null) {
return head;
}
ListNode dummyNode = head;
int n = 1;
while (dummyNode.next != null) {
dummyNode = dummyNode.next;
n += 1;
}
int add = n - k % n;
if (add == n) {
return head;
}
dummyNode.next = head;
while (add-- > 0) {
dummyNode = dummyNode.next;
}
ListNode re = dummyNode.next;
dummyNode.next = null;
return re;
}
}
根据情况自己调整吧!