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等于0及k大于链表长度的情况,可以通过取余就可以解决,对于这个题目,我们可以设置两个指针,一前一后,前面的指针走到第k个节点,后面指针走到第一个节点,知道前面的指针走到链表末尾,那么后面指针就是第K个节点,然后进行旋转。

class Solution {
public:
    ListNode* rotateRight(ListNode* head, int k) {
         ListNode *pHead, *pAhead,*pBehind,*temp,*p,*p1;  
     int n = 1;
     int count = 0;
     if(head == NULL) //考虑空节点
     {
         return NULL;
     }

     pHead  = head;
     pAhead = head;
    temp = head;
while(temp)  //获取链表长度
     {
        count++; 
       temp = temp->next;  
     }
     k = k % count; 

     if(k==0||head->next == NULL) //考虑k =0
     {
         return head;
     }

     while(n < k) //前一个指针,指向第k个节点
     {
     pAhead = pAhead->next;
     n++;
     } 
    pBehind = head;
    while(pAhead->next)
    {
           p = pAhead;
        pAhead = pAhead->next;
        p1 = pBehind;
        pBehind = pBehind->next;
    }
    if(k == 1) //考虑仅末尾节点进行旋转
    {
        p->next= NULL;
        pAhead->next = head;
        return pAhead;

    }
    pAhead->next = head;  //非末尾节点旋转。
    pHead =p1->next;
   p1->next = NULL;
   return pHead;

    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值