旋转链表
题目:给你一个链表的头节点head,旋转链表,将链表每个节点向右移动k个位置。
示例
输入:head=[1,2,3,4,5],k=2
输出:[4,5,1,2,3]
解题思路:
可以将链表做成一个环,每次移动看成头节点的移动。因此可以观察到:由于移动k个位置,k有可能大于给出的链表长度,所以首先求出链表长度,然后找到分段点(k-k%count),其中链表长度count可以通过遍历链表得知,找到分段点后,将分段点的下一节点赋给头节点,然后断开分段点,最后返回头节点即可。
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode rotateRight(ListNode head, int k) {
//特殊情况
if (k == 0 || head == null || head.next == null) {
return head;
}
//计算链表长度
int count = 1;
ListNode cur = head;
while (cur.next != null) {
cur = cur.next;
count++;
}
cur.next=head;//成环
//找到分段点
for(int i=0;i<count-k%count;i++){
cur = cur.next;
}
//把分段点下一节点赋给头节点
head=cur.next;
//把分段点断开
cur.next=null;
return head;
}
}
提交结果