leetcode----61. Rotate List

链接:

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;
    }
}

结果:

结论:

一般来说,链表循环移动使用环解决比较方便,数组循环移动使用复制数组两倍长度的方法比较方便。 

 

猜你喜欢

转载自blog.csdn.net/smart_ferry/article/details/88894180
今日推荐