• 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

  • 相关阅读:
    软件工程个人作业(4)
    软件工程个人作业(3)
    软件工程个人作业(2)
    软件工程个人作业(1)
    构建之法
    消息分发机制,实现战场与UI通信功能
    设置父物体方法(包括层级)
    NGUI通过点击按钮来移动面板位置,实现翻页功能
    unity中调用android的剪切板
    屏蔽UI事件
  • 原文地址:https://www.cnblogs.com/TenosDoIt/p/3702085.html
Copyright © 2020-2023  润新知