• 【LeetCode】61. 旋转链表


    【题目描述】

    给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。

    示例 1:

    输入: 1->2->3->4->5->NULL, k = 2
    输出: 4->5->1->2->3->NULL
    解释:
    向右旋转 1 步: 5->1->2->3->4->NULL
    向右旋转 2 步: 4->5->1->2->3->NULL
    示例 2:

    输入: 0->1->2->NULL, k = 4
    输出: 2->0->1->NULL
    解释:
    向右旋转 1 步: 2->0->1->NULL
    向右旋转 2 步: 1->2->0->NULL
    向右旋转 3 步: 0->1->2->NULL
    向右旋转 4 步: 2->0->1->NULL

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/rotate-list

    【解题思路】

    1、先把原链表链成一个环形链表,将其表尾指向表头;

    2、找到旋转的起点作为新链表的表头;

    【提交代码】

     1 /**
     2  * Definition for singly-linked list.
     3  * struct ListNode {
     4  *     int val;
     5  *     struct ListNode *next;
     6  * };
     7  */
     8 
     9 struct ListNode* rotateRight(struct ListNode* head, int k)
    10 {
    11     int i;
    12     int n;
    13     int offset;
    14     struct ListNode *p;
    15 
    16     if( head == NULL || head->next == NULL )
    17         return head;
    18 
    19     p = head;
    20     n = 1;
    21     // p移到链表的尾巴,并且获取到链表的长度len
    22     while( p->next != NULL )
    23     {
    24         p = p->next;
    25         n++;
    26     }
    27     //printf("link list len: %d
    ", n);
    28 
    29     // 链表的尾巴指向head,形成一个环
    30     p->next = head;
    31 
    32     // 找到旋转的起点,需要从head开始移动多少步
    33     offset = n - ( k % n ) - 1;
    34     //printf("offset: %d
    ", offset);
    35 
    36     p = head;
    37     // p移动到新链表头的前一个节点
    38     for( i = 0; i < offset; i++ )
    39     {
    40         p = p->next;
    41     }
    42     // 新链表的表头
    43     head = p->next;
    44 
    45     p->next = NULL;
    46 
    47     return head;
    48 }
  • 相关阅读:
    react 编写日历组件
    腾讯地图打开地图选取位置 withMap
    react 动态修改 document.title
    axios 中断请求
    react 使用 react-loadable分包
    http Authorization
    @media screen媒体查询
    CSS规范
    布局和WEB性能
    CSS 标签的分类,及显示模式
  • 原文地址:https://www.cnblogs.com/utank/p/13278324.html
Copyright © 2020-2023  润新知