链接:
https://leetcode.com/problems/rotate-list/
大意:
给定一个链表头节点head以及一个非负数k,要求链表向右移动k个单位后得到的新链表。例子:
思路:
首先得到链表的长度len,记录链表的尾节点,并把链表的尾节点指向头节点(即构成一个循环链表)。 之后 k %= len,将多轮重复的右移简化为一轮右移。原链表向右移k个位置,即相当于把原来的尾节点沿环移动len-k个位置成为新的尾节点,则相应地新的尾节点的右边节点为新链表的头节点。
代码:
/**
* 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;
int len = 0;
ListNode pre = null,h = head;
while (h != null) {
len++;
pre = h;
h = h.next;
}
pre.next = head; // 使链表成环
k %= len;
int i = 0;
// 从原来的最后一个节点开始 找到第len-k个节点,则该节点为新链表的尾节点,该节点的下一个节点为新链表的头节点
while (i < len - k) {
pre = pre.next;
i++;
}
ListNode newHead = pre.next;
pre.next = null;
return newHead;
}
}
结果:
结论:
一般来说,链表循环移动使用环解决比较方便,数组循环移动使用复制数组两倍长度的方法比较方便。