自己想的方法是:
1. 求出链表长度
2. 找出倒数第K个节点的前一个节点
3. 断开链表,寻找后半部分链表的末尾节点,然后接上前半部分
上述方法的缺点是:寻找后半部分链表的末尾节点又需要遍历一次。
改进思路1:通过快慢指针寻找倒数第k个节点的前一个节点,最后快指针指向后半部分链表的末尾节点
改进思路2:先将链表闭合成环,找到相应的位置断开这个环,确定新的链表头和链表尾
class Solution { public ListNode rotateRight(ListNode head, int k) { if (head == null || head.next == null || k == 0) return head; /** * 改进思路1:快慢指针 */ /* int len = 1; ListNode cur = head; while (cur.next != null) { cur = cur.next; len ++; } k = k % len; if (k == 0) return head; ListNode fast = head, slow = head; for (int i = 0; i < k; i++) { fast = fast.next; } while (fast.next != null) { fast = fast.next; slow = slow.next; } ListNode newHead = slow.next; slow.next = null; fast.next = head; return newHead; */ /** * 改进思路2:闭合成环后遍历 */ // Step1 :求出链表长度 int len = 1; ListNode cur = head; while (cur.next != null) { cur = cur.next; len ++; } k = k % len; if (k == 0) return head; // Step2 :闭合成环 cur.next = head; // Step3 :寻找倒数第k个节点的前一个节点 for (int i = 0; i < len - k; i++) { cur = cur.next; } ListNode newHead = cur.next; cur.next = null; return newHead; } }