给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。
思路: 首先链成环,找到作为头节点新节点,然后拆环
1、链表长度为n,将它设置成为一个环形链表,则节点移动n次后回到原来位子。k >=n 时候可以用 k = k%n 来判断需要移动的位子。
2、k 值 对应是 倒数第k个节点作为新得头节点。 (示例1,k = 2,则倒数第2个节点 4 作为新的头节点)。这个4节点的位子 为 n - k +1
3、将环形链表拆开,需要将新头节点前面的节点的next置空( 4是头节点 则3.next = null)
4、输出新头节点
/**
* 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 || head.next == null || k == 0) return head;
ListNode node = head;
int n = 1;
while(node.next != null) {
node = node.next;
n ++;
}
ListNode tail = node; //记录尾节点
node = head;
ListNode prenode = head;
if(k >= n){
k = k % n;
}
if(k == 0 ) return head;
int index = n - k + 1;
//找到index 处的节点 ,让他成为头节点
for(int i = 1; i < index; i++) {
prenode = node;
node = node.next;
}
tail.next = head; //链成环
//将 node节点置为head,并把前节点指向null
prenode.next = null;
head = node;
return head;
}
}