LeetCode - 61. Rotate List

本文介绍了一种高效解决链表旋转问题的方法,通过移动头节点指针而非逐个移动节点来实现链表的旋转。讨论了如何处理k大于链表长度的情况,并提供了具体的实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这道题目提供了一个很好的思路,在遇到Linked List的问题时,当看似需要我们移动很多node的时候,我们可以直接移动指向头节点的指针,而不是一个一个地去移动node。另外这道题目还有一个隐藏的陷阱,就是题目中给出的k可能是大于Linked List长度的,所以在解答这道题目的时候还要处理一下这一点。一些例子如下:

[1, 2, 3]; k = 2 -> [2, 3, 1]

可以直接将头节点指向2,将3的next指向1,而将1的next指向null;rotate之后的头节点为原来的第length - k个节点

[1, 2, 3]; k = 5 -> [2, 3, 1]

这个例子的答案与上个例子一样,因为 5 % 3 == 2 % 3 == 2,而且rotate的方法也一样;rotate之后的头节点为原来的第length - (k % length)个节点

所以根据上面的描述我们可以总结出这道题目的解法,使用两个指针,将两个指针分别指向原Linked List的头节点和第length - (k % length) - 1个节点(因为要将这个结点的next设置为null),然后依照上面例子中的方法进行rotate。同时因为这道题目中头节点会发生变化,所以最好使用dummyNode,代码如下:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
public class Solution {
    public ListNode rotateRight(ListNode head, int k) {
        if(head == null || head.next == null) return head;      // corner case
        
        // Set dummyNode
        ListNode dummyNode = new ListNode(0);
        dummyNode.next = head;
        
        // Set pointers
        ListNode fast = dummyNode;
        ListNode slow = dummyNode;
        
        // Find the length of list
        int l;
        for(l = 0; fast.next != null; l++){
            fast = fast.next;
        }
        
        // Set slow to the l - (k % l)the node
        for(int j = l - (k % l); j > 0; j--){
            slow = slow.next;
        }
        
        // Rotate list
        fast.next = dummyNode.next;
        dummyNode.next = slow.next;
        slow.next = null;
        
        return dummyNode.next;
    }
}


知识点:

1. 在Linked List中,如果需要移动的node有很多,那么可以考虑是否可以直接移动头节点的指针

2. dummyNode


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值