• LeetCode:Rotate List


    题目链接

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

    For example:
    Given 1->2->3->4->5->NULL and k = 2,
    return 4->5->1->2->3->NULL.


    首先要弄清题目的意思:旋转链表k个位置,这里旋转一次表示从链表尾部拿一个节点放到链表头部,因此当k等于链表长度的整数倍时,相当于链表又还原到原来的状态。

    设链表长度为n,k = k % n, 则题目的意思是相当于把链表的后k个节点放到链表头部,因此我们只需要找到链表的倒数第k个节点,然后让尾节点指向头结点,倒数第k+1个节点的next指向NULL。当然要注意边界条件,例如k刚好是链表长度的整数倍。    本文地址

    对于找到链表的倒数第k个节点,可以用双直针的方法,第一个指针先指向第k个节点,第二个指针指向头结点,然后两个节点一起前进,当第一指针指向尾节点时,第二个指针就指向倒数第k个节点

     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         if(head == NULL || head->next == NULL || k == 0)return head;
    13         //找到倒数第k个节点backCountK,backCountK_pre是其前驱(k = k % 链表长度)
    14         ListNode* backCountK = head, *backCountK_pre = NULL, *p = head;
    15         for(int i = 1; i < k; i++)
    16         {
    17             p = p->next;
    18             if(p == NULL)p = head;//表示k超过了链表的长度
    19         }
    20         
    21         while(p->next)
    22         {
    23             backCountK_pre = backCountK;
    24             backCountK = backCountK->next;
    25             p = p->next;
    26         }
    27         if(backCountK_pre == NULL)return head;//k等于链表的长度的整数倍
    28         p->next = head;
    29         backCountK_pre->next = NULL;
    30         return backCountK;
    31     }
    32 };

    【版权声明】转载请注明出处:http://www.cnblogs.com/TenosDoIt/p/3702085.html

  • 相关阅读:
    ajax配置项中的type与method
    解决 eclipse出现 Address already in use: bind,以及tomcat端口占用
    网络流定理总结
    题解说明
    sol
    题解P4201: [NOI2008]设计路线
    题解 Luogu P5434: 有标号荒漠计数
    题解 Luogu P2499: [SDOI2012]象棋
    JZOJ-2019-11-8 A组
    JZOJ-2019-11-7 A组
  • 原文地址:https://www.cnblogs.com/TenosDoIt/p/3702085.html
Copyright © 2020-2023  润新知