61 Rotate List

本文提供了一种解决方案,用于将链表向右旋转k个位置。通过两段不同的代码实现了这一功能,一种方法是寻找链表的末尾并计算其长度,然后确定实际需要旋转的位置;另一种方法则将链表连接成环形,再进行旋转。

1 题目

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

2 尝试解

class Solution {
public:
    ListNode* rotateRight(ListNode* head, int k) {
        if(head == NULL) return head;
        ListNode* slow = head;
        ListNode* fast = head;
        int size = 1;
        while(fast->next !=NULL){  //fast to the end, get the size of list
            fast = fast->next;
            size ++;
        }
        if(size <= k) {  
            k = k % (size);
        }
        int count = 1;
        while(count < size - k){ //slow to the breakpoint
            slow = slow->next;
            count++;
        }
        
        if(slow != fast){
            ListNode* start = slow->next;
            fast->next = head;
            slow->next = NULL;
            return start;
        }
        return head;
    }
};

3 标准解

class Solution {
public:
    ListNode* rotateRight(ListNode* head, int k) {
        if(!head) return head;
        
        int len=1; // number of nodes
        ListNode *newH, *tail;
        newH=tail=head;
        
        while(tail->next)  // get the number of nodes in the list
        {
            tail = tail->next;
            len++;
        }
        tail->next = head; // circle the link

        if(k %= len) 
        {
            for(auto i=0; i<len-k; i++) tail = tail->next; // the tail node is the (len-k)-th node (1st node is head)
        }
        newH = tail->next; 
        tail->next = NULL;
        return newH;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值