LeetCode 61. Rotate List

简介: 给定链表,将列表向右旋转k个位置,其中k为非负数。

v2-1b7021c2c7e59af1f25eb9789d6112e4_1440w.jpg

Description



Given a linked list, rotate the list to the right by k places, where k is non-negative.


Example 1:


Input: 1->2->3->4->5->NULL, k = 2

Output: 4->5->1->2->3->NULL


Explanation:

rotate 1 steps to the right: 5->1->2->3->4->NULL

rotate 2 steps to the right: 4->5->1->2->3->NULL


Example 2:


Input: 0->1->2->NULL, k = 4

Output: 2->0->1->NULL


Explanation:

rotate 1 steps to the right: 2->0->1->NULL

rotate 2 steps to the right: 1->2->0->NULL

rotate 3 steps to the right: 0->1->2->NULL

rotate 4 steps to the right: 2->0->1->NULL


描述



给定链表,将列表向右旋转k个位置,其中k为非负数。


思路



  • 这道题是给定一个链表,让后给定一个非负整数k,要求将链表的最后一个元素放到链表的首位,执行k次.
  • 这道题目相对比较简单,我们首先对k做一次预处理
  • 我们获取链表的长度length,令k = k % length:比如如果链表有3个元素,k=7和k=1的效果是一样的
  • 然后我们获取倒数第k+1的元素,获取其指向的下一个元素的索引,赋值给res,然后将其置为None.
  • 最后再将原来的末尾的索引指向头部,返回res即可


class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None
class Solution:
    def rotateRight(self, head, k):
        """
        :type head: ListNode
        :type k: int
        :rtype: ListNode
        """
        # 如果head指向空或者k==0则直接返回
        if not head or k == 0:
            return head
        count, before, last = 1, head, head
        # 统计一共有多少个元素
        while before.next:
            count += 1
            before = before.next
        # before重新回到起始位置
        before = head
        # 对k进行求模运算,避免重复搬运
        k = k % count
        # 如果k求模运算结果为0,则仍然直接返回
        if k == 0:
            return head
        # last指向编号为k的元素
        for _ in range(k):
            last = last.next
        # 找到倒数第k+1个元素
        while last and last.next:
            last = last.next
            before = before.next
        # 将倒数第k+1个元素指向元素的引用赋值给res,改变倒数第k+1个元素的指向为None,将原本的last.next指向头节点
        res = before.next
        before.next = None
        last.next = head
        return res

源代码文件在这里.


目录
相关文章
|
Java
Leetcode 114. Flatten Binary Tree to Linked List
思路也很简单,先把root的左子树(如有)变成单链表 leftlinkedlist,把root的右子树(如有)变成单链表 rightlinkedlist,再把root的右节点变成leftlikedlist,再把rightlinkedlist接到leftlinkedlist后面,代码如下。
50 1
|
C++
Leetcode Copy List with Random Pointer(面试题推荐)
给大家推荐一道leetcode上的面试题,这道题的具体讲解在《剑指offer》的P149页有思路讲解,如果你手头有这本书,建议翻阅。
54 0
Leetcode 19.Remove Nth Node From End of List
删除单链表中的倒数第n个节点,链表中删除节点很简单,但这道题你得先知道要删除哪个节点。在我的解法中,我先采用计数的方式来确定删除第几个节点。另外我在头节点之前额外加了一个节点,这样是为了把删除头节点的特殊情况转换为一般情况,代码如下。
45 0
|
8月前
|
大数据 Java 程序员
「LeetCode合集」链表(List)及经典问题
「LeetCode合集」链表(List)及经典问题
57 0
LeetCode 141. 环形链表 Linked List Cycle
LeetCode 141. 环形链表 Linked List Cycle
LeetCode 237. 删除链表中的节点 Delete Node in a Linked List
LeetCode 237. 删除链表中的节点 Delete Node in a Linked List
LeetCode Contest 178-1367. 二叉树中的列表 Linked List in Binary Tree
LeetCode Contest 178-1367. 二叉树中的列表 Linked List in Binary Tree
LeetCode 382. Linked List Random Node
给定一个单链表,随机选择链表的一个节点,并返回相应的节点值。保证每个节点被选的概率一样。
70 0
LeetCode 382. Linked List Random Node
LeetCode 234. 回文链表 Palindrome Linked List
LeetCode 234. 回文链表 Palindrome Linked List
LeetCode 206. 反转链表 Reverse Linked List
LeetCode 206. 反转链表 Reverse Linked List