欢迎关注我的公众号《小沈干货》,谢谢大家。
给定一个链表,旋转链表,将链表每个节点向右移动 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
思路:首先需要一次循环判断一共有多少个节点,这样避免k值过大,造成旋转节点多次无用重复,会出现超时。
接下用k对节点数取余,这就是要循环的次数,也即右指针与左指针之间的节点个数。leetcode19题就是这种解题思路。
然后用双指针,right先循环上面算出的值,然后right.next!=null时,right和left都一直往后取,最后的left就是旋转结束时的最后一个节点
left后面的节点就是要拿到前面去的节点。
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public ListNode rotateRight(ListNode head, int k) { if(head == null || head.next == null || k==0) return head; ListNode dummyHead = new ListNode(0); dummyHead.next = head; ListNode left = dummyHead; ListNode right = head; ListNode check = head; long flag = 0; while(check!=null){ check = check.next; flag++; } for(int i = 0;i<k%flag;i++){ if(right.next!=null) right = right.next; else right = head; } while(right!=null){ right = right.next; left = left.next; } ListNode cur = left.next; ListNode temp = cur; left.next = null; while(temp!=null && temp.next!=null){ temp = temp.next; } if(cur!=null){ temp.next = head; dummyHead.next = cur; } return dummyHead.next; } }