61. 旋转链表

题目分析:分析题目的要求之后,有点像先找到链表的倒数第k个结点,然后将链表首位相连在一起成环状,然后从倒数第k个结点成为新的头节点,从其前面断开。
先让q指针从head出发往后遍历k+1个结点,开始让p也从head出发和q一起同时往后挪动,当q到链表的最后一个结点的时候,p所指的结点就是倒数第k+1个结点。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* rotateRight(ListNode* head, int k) {
        if(head==NULL){
            return head;         //如果链表为空,直接返回
        }
        int length = 0;          //链表中的结点个数
        ListNode *p= head,*q = head;     //p和q为工作指针
        while(q!=NULL) 
        {
            q = q->next;                 //统计链表的节点个数
            length++;
        }
        if(k==length||length==1||k%length==0)    //如果k和链表长度一样,或者链表就只有一个结点,或者k是链表长度的整数倍,那么直接返回head即可。因为反转之后和之前的链表是一样的
            return head;
        k = k%length;    //更新k
        q = head;        //q回到链表的开始节点
        while(q->next)
        {                 //此while使p定位到新的链表的尾结点
            if(k<=0){
                p = p->next;
            }
            q = q->next;
            k--;
        }
        q->next = head;      //将链表首位相连
        head = p->next;      //从p结点后面断开,成为新的单链表
        p->next =  NULL;
        return head;
    }
};
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值