Leetcode 61. 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的位置,旋转链表。可以先计算总长度L,然后找到L-k的位置。不过要注意k可能大于L,需要先将k%L。给出几个易错的测试数据如下。

/*
[1,2,3,4,5]
4
[1,2,3,4,5]
5
[1,2,3,4,5]
6
[1,2,3,4,5]
7
[1,2]
3
[]
0
[]
1
[1,2,3]
2000000000
*/
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* rotateRight(struct ListNode* head, int k) {
    struct ListNode* p1,*p2;
    p1=head,p2=head;
    //计算链表长度
    int length=0;
    while(p1!=NULL)
    {
        length=length+1;
        p1=p1->next;
    }
    //k值好像可以循环遍历链表,所以求模,减少时间
    if(length==0) return head;
    else if(length==1)
        k=1;
    else
        k=k%length;
    //一个指针从左往右找第K个
    p1=head;
    for(int i=0;i<k;i++)
    {
        if(p1!=NULL&&p1->next!=NULL) p1=p1->next;
        else p1=head;
    }
    if(p1==NULL)
    {
        return head;
    }
    //另一个指针从头开始,则当第一个指针到最后时候,另一个指针到达倒数第k个
    while(p1->next!=NULL)
    {
        p1=p1->next;
        p2=p2->next;
    }
    p1->next=head;
    head=p2->next;
    p2->next=NULL;
    return head;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,769评论 0 33
  • Given a list, rotate the list to the right by k places, w...
    关玮琳linSir阅读 184评论 0 1
  • 原题 给定一个链表,旋转链表,使得每个节点向右移动k个位置,其中k是一个非负数。 样例给出链表1->2->3->4...
    Jason_Yuan阅读 256评论 0 0
  • 我把我的悲伤放入黄昏, 让你的眼睛一览无余。 如果你记得我也不要洒下眼泪, 但用你的余生记住这个黄昏, 原来我想你...
    简村小吹阅读 139评论 4 2
  • 花了大概3个星期的时间,断断续续地把李笑来老师的《把时间当作朋友》读完了,也认真地做了笔记。可以说是收获颇多,也有...
    城堡小姐阅读 286评论 0 0