61 旋转链表
题目:
给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。
示例 1:
输入: 1->2->3->4->5->NULL, k = 2
输出: 4->5->1->2->3->NULL
解释:
向右旋转 1 步: 5->1->2->3->4->NULL
向右旋转 2 步: 4->5->1->2->3->NULL
示例 2:
输入: 0->1->2->NULL, k = 4
输出: 2->0->1->NULL
解释:
向右旋转 1 步: 2->0->1->NULL
向右旋转 2 步: 1->2->0->NULL
向右旋转 3 步: 0->1->2->NULL
向右旋转 4 步: 2->0->1->NULL
思路:
只需要O(n)时间复杂度的算法:
- 求出链表的长度n
- k = k % n
- 用双指针法找到链表倒数第k个位置
- 记录慢指针的next节点,这就是要返回链表的头结点
- 从慢指针的next节点开始断开链接,后一段的尾结点指向前一段的头结点
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| class Solution { public ListNode rotateRight(ListNode head, int k) { if(head == null) return null; int length = getLength(head); k = k % length; if(length == 1 || k == 0) return head; for(int i = 0; i < k;i++){ ListNode cur = head; while(cur.next.next != null) cur = cur.next; cur.next.next= head; head = cur.next; cur.next = null; } return head; } public int getLength(ListNode head){ ListNode cur = head; int length = 1; while(cur.next != null){ cur = cur.next; length++; } return length; } }
|