这个题目也不难,只要分析出来旋转的规律就比较简单了。我看到的规律有两点:
- 旋转了k次,其实就是对链表旋转了
k % 链表长度
次。 - 旋转其实就是求倒数第
k
个节点,然后让这个节点及后面的节点接到头部。
有了这两点,代码上可能就是要保存的变量比较多,还是要尝试写一下,但思路不难:
public ListNode rotateRight(ListNode head, int k) {
if (head == null || head.next == null) //如果是个空链表或者只有一个节点,则可直接返回
return head;
ListNode tail = head;
//求链表长度NodesCount
int NodesCount = 0;
while (tail != null) {
NodesCount++;
tail = tail.next;
}
k = k % NodesCount; //求出实际的倒数第k个,若为0说明不需要旋转,直接返回
if (k == 0)
return head;
//只要涉及到头结点会改变,最好变为带头结点的链表
ListNode NewHead = new ListNode(0);NewHead.next = head;
ListNode p = NewHead, q = p; //让p.next指向倒数第k个,q指向尾节点
for (int i = 0; i < k; ++i)
q = q.next;
while (q.next != null) {
p = p.next;
q = q.next;
}
//将p后面的链表移动到最开始
ListNode result = p.next;
p.next = null;
q.next = NewHead.next;
return result;
}
下图为最后各指针指向的位置,此处有个为0的头结点我没有画出来。