zoukankan      html  css  js  c++  java
  • 【Leetcode】旋转链表

    题目链接:旋转链表


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

    输入: 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


    题解:因为可能出现k > 链表长度的情况,所以先统计链表长度。得到真正需要移动的步数(k%len)。

    然后我们移动到需要移动的这个节点这里,从这里断开成两个链表,然后组合。

    举例:

    1->2->3->4->5->NULL k = 2

    向右移动2步。也就是我们需要从4这里断开。len = 5,k = 2。

    但是我们为了方便链表尾节点,所以使指针p移动到3这里就应该停下。

    head = p->next;   (4)

    p->next = NULL;    (3)


    代码:

     1 /**
     2  * Definition for singly-linked list.
     3  * struct ListNode {
     4  *     int val;
     5  *     ListNode *next;
     6  *     ListNode(int x) : val(x), next(NULL) {}
     7  * };
     8  */
     9 class Solution {
    10 public:
    11     ListNode* rotateRight(ListNode* head, int k) {
    12 
    13         if(head == NULL || head->next == NULL)  return head;
    14 
    15         ListNode* p = head;
    16         ListNode* pre = NULL;
    17         //统计链表长度
    18         int len = 0;
    19         while(p){
    20             pre = p;
    21             p = p->next;
    22             len++;
    23         }
    24         k = k%len;
    25         if(k == 0 ) return head;
    26 
    27         pre->next = head;
    28         p = head;
    29         
    30         //断成两个链表
    31         for(int i = 0; i < len-k-1; i++){
    32             p = p->next;
    33         }
    34 
    35         //重新组合
    36         head = p->next;
    37         p->next = NULL;
    38 
    39         return head;
    40 
    41     }
    42 };
  • 相关阅读:
    qemu-kvm磁盘读写的缓冲(cache)的五种模式
    关于追踪qemu 源码函数路径的一个方法
    准备升大三啦
    关于Vim的一个配置文件
    POJ 3253
    hihocoder 第二十五周 spfa 最短路
    POJ 2718 穷举
    《鸟哥Linux私房菜基础学习篇》命令索引
    博文流
    《SDN核心技术剖析和实战指南》3.3读书笔记
  • 原文地址:https://www.cnblogs.com/Asumi/p/12514438.html
Copyright © 2011-2022 走看看