转动链表

转动链表

http://www.nowcoder.com/questionTerminal/afbec6b9d4564c63b2c149ccc01c5678

基本思路:

  1. 先求链表长度n,然后k = k mod n
  2. 将链表首尾相连
  3. 找到新的head的前一个节点,断链,返回新head

代码如下:

//
// Created by jt on 2020/9/26.
//
class Solution {
public:
    /**
     *
     * @param head ListNode类
     * @param k int整型
     * @return ListNode类
     */
    ListNode* rotateRight(ListNode* head, int k) {
        // write code here
        // 如果只有0个或1个节点
        if (!head || k == 0) return head;
        // 将k与链表长度取模
        int n = 1;
        ListNode *p = head, *q = head;
        while (p->next) { ++n; p = p->next; }
        k %= n; k = n - k;
        // 找到新链表头节点的前一个节点
        while (--k > 0) { q = q->next; }
        // 合链
        p->next = head;
        // 断链
        ListNode *newHead = q->next;
        q->next = nullptr;
        return newHead;
    }
};
刷遍天下无敌手 文章被收录于专栏

秋招刷题历程

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务