1.题目
如何将单链表向右旋转k个位置。
给定单链表1->2->3->4->5->6->7, k = 3,那么旋转后的单链表变为5->6->7->1->2->3->4
2.解法
public class Sort {
/**
* 功能描述: 根据k的个数,将链表向右旋转k个位置
* 输入参数: 链表头结点
* 利用了寻找倒数第k个结点的知识
*/
public static void rightRotate(Node head, int k){
if(head == null || head.next == null || k < 1){
return;
}
// 前部分有k+1个结点,后半部分有k个结点
// 所以使用快慢指针移动是可以的,之间维持k个结点
Node slow, fast, tmp;
slow = fast = head.next;
// 1.先将fast移动到第k个位置
for(int i = 1; i <= k; i++){
// 如果结点为 null,说明没有第k个位置, 说明已经超过链表长度
if(fast.next != null){
fast = fast.next;
} else {
return;
}
}
// 2.slow和fast同步移动,fast移动到尾结点时,slow正好
while(fast.next != null){
slow = slow.next;
fast = fast.next;
}
// 3.开始连接结点
tmp = slow.next;
slow.next = null;
fast.next = head.next;
head.next = tmp;
}
public static void main(String[] args) {
// 假的头结点
Node head = new Node(-1);
Node cur = head;
Node tmp = null;
for(int i = 1; i < 8; i++){
tmp = new Node(i);
cur.next = tmp;
cur = tmp;
}
// 向右旋转
rightRotate(head, 3);
for (cur = head.next; cur != null; cur = cur.next){
System.out.print(cur.data + " ");
}
}
}
3.思路
1.首先找到链表的倒数第k+1个结点slow和尾巴结点fast
2.将链表断开成两个子链表,其中后半部分的子链表的结点个数为k