题目描述
给你一个链表的头节点 head
,旋转链表,将链表每个节点向右移动 k
个位置。
示例 1:
输入:head = [1,2,3,4,5], k = 2 输出:[4,5,1,2,3]
示例 2:
输入:head = [0,1,2], k = 4 输出:[2,0,1]
实现思路
1.使用虚拟头结点dummy,虚拟头节点的next指向head;
2.计算链表长度size;
3.反转一次的操作为,将链表中最后一个节点的next指向链表中的第一个节点,最后一个节点的前一个节点的next指向null。此时,最后一个节点的next为该节点的头节点,那么令head等于该节点。
实现代码
public ListNode rotateRight(ListNode head, int k) {
if( k == 0 || head == null || head.next == null ){
return head;
}
ListNode dummy = new ListNode(1);
dummy.next = head;
ListNode q = head;
int size = 0;
while(q != null){
q = q.next;
size++;
}
int num = k % size;
for(int i = 0; i < num; i++){
ListNode p = head;
while(p.next.next != null){
p = p.next;
}
dummy.next = p.next;
p.next.next = head;
head = dummy.next;
p.next = null;
p = head;
}
return dummy.next;
}