每日一题之旋转链表

题目描述

给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。
在这里插入图片描述

解题思路

  1. 右移k个位置,实际上就是把最后k个节点,放到链表头前面。所以,可用双指针,找到链表的倒数k+1个节点,将其next指向NULL,作为新链表结尾。将链表最后一个节点指向原链表头,最后返回倒数第k个节点的地址。
    在这里插入图片描述
  2. 设链表长度为n,右移n个位置,就会得到原链表。所以当k > n时,右移k个位置,实际上是右移 k % n个位置

解题代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */

int list_nums(struct ListNode* head)
{
    int nums = 0;
    while (head != NULL)
    {
        nums++;
        head = head->next;
    }
    return nums;
}

struct ListNode* rotateRight(struct ListNode* head, int k){
    int nodeNums = list_nums(head);
    if (nodeNums == 0)
        return head;

    int realK = k % nodeNums;
    if (realK == 0)
        return head;

    struct ListNode *fast = head, *slow = head;
    while (fast->next != NULL)
    {
        fast = fast->next;
        if (--realK < 0)
        {
            slow = slow->next;
        }
    }

    struct ListNode *tmp = slow->next;
    slow->next = NULL;
    fast->next = head;
    return tmp;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C每日一练中的环形链表Ⅱ问题是指LeetCode刷题专栏中的第142题。该问题的目标是找到给定链表中的环的入口节点。解决这个问题的一种常用方法是使用快慢指针。 快慢指针解法中,快指针的步数是慢指针的两倍,即慢指针一次走一步,快指针一次走两步。两个指针从链表的起始位置开始运行,如果链表中存在环,则快指针最终会追上慢指针,二者会在环中相遇。如果链表不带环,则快指针会率先走到链表的末尾。这种思路可以通过在纸上画图来更好地理解。 在解决环形链表Ⅱ问题时,我们可以按照以下步骤进行操作: 1. 定义快慢指针,初始时都指向链表节点。 2. 快指针一次走两步,慢指针一次走一步,直到两个指针相遇或快指针到达链表末尾。 3. 如果快指针到达链表末尾,则说明链表中没有环,直接返回null。 4. 如果快慢指针相遇,则说明链表中存在环。 5. 重新定义一个指针,从链表节点开始,与慢指针同时移,每次移一步,直到两个指针再次相遇。 6. 当两个指针再次相遇时,它们所指向的节点就是环的入口节点。 通过以上步骤,我们可以找到给定链表中环的入口节点。注意,在实际编码中,需要考虑边界条件和特殊情况的处理。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [【LeetCode】每日一题链表部分经典题型](https://blog.csdn.net/qq_63320529/article/details/130697933)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值